Russian Qt Forum
Ноябрь 24, 2024, 14:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как быстро преобразовывать QByteArray в std::vector<unsigned char> и обратно?  (Прочитано 24624 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #15 : Ноябрь 12, 2014, 14:53 »

RVO умеют практически все компиляторы (в отличии от NRVO), это во-первых..
Во-вторых, зачем писать две строчки вместо одной..?

 
Цитировать
зачем на пустом месте создавать потенциальный гемор, когда можно прекрасно обойтись без отдельной функции, либо с параметром ссылкой на вектор.
Никакого гемора никто не создаёт, как и потенциальных граблей, в данном конкретном примере.. (с RVO). 
Потом, мне удобней написать так:
Код
C++ (Qt)
type x = func();
 
   
чем так:
Код
C++ (Qt)
type x;
func(x);
 
Первый вариант более прозрачный и лаконичный..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
vulko
Гость
« Ответ #16 : Ноябрь 12, 2014, 15:04 »

RVO умеют практически все компиляторы (в отличии от NRVO), это во-первых..
Во-вторых, зачем писать две строчки вместо одной..?

 
Цитировать
зачем на пустом месте создавать потенциальный гемор, когда можно прекрасно обойтись без отдельной функции, либо с параметром ссылкой на вектор.
Никакого гемора никто не создаёт, как и потенциальных граблей, в данном конкретном примере.. (с RVO). 
Потом, мне удобней написать так:
Код
C++ (Qt)
type x = func();
 
   
чем так:
Код
C++ (Qt)
type x;
func(x);
 
Первый вариант более прозрачный и лаконичный..

почти != все
с какими флагами оптимизации они это умеют? все ли при одной и той же оптимизации будут делать оптимизацию return value?
« Последнее редактирование: Ноябрь 13, 2014, 12:37 от Пантер » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #17 : Ноябрь 12, 2014, 19:48 »

Цитировать
почти != все
Это понятно.. какие-нибудь допотопные, возможно и не умеют RVO..
Но сейчас это уже не актуально. Вы делаете из мухи слона..

Если кто-то страдает RVO-фобией, то пожалуйста, передавайте объект через ссылку.. Мне в общем то фиолетово)

Однако, любой уважающий себя программист должен помнить(знать) об этой весьма полезной оптимизации, которая сейчас уже де-факто стандарт для современных компиляторов.

И если уж разговор зашёл об оптимизации, то, я надеюсь, вы 7(семь) раз подумаете прежде чем давать рекомендации типа:
Код
C++ (Qt)
copy(&dataArray[0], &dataArray[dataArraySize], back_inserter(dataVec));
 
Улыбающийся
 
« Последнее редактирование: Ноябрь 13, 2014, 12:37 от Пантер » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #18 : Ноябрь 13, 2014, 09:38 »

Не знал раньше про rvo и nrvo. Было интересно.
На мой взгляд оптимальным вариантом будет использование memcpy. Быстрее него всё равно ничего не напишешь. И голова не болит о том, как и какая строчка будет воспринята каким-либо компилятором. Или я ошибаюсь?
Записан
vulko
Гость
« Ответ #19 : Ноябрь 13, 2014, 09:42 »

Не знал раньше про rvo и nrvo. Было интересно.
На мой взгляд оптимальным вариантом будет использование memcpy. Быстрее него всё равно ничего не напишешь. И голова не болит о том, как и какая строчка будет воспринята каким-либо компилятором. Или я ошибаюсь?

memcpy + обычный массив будут работать быстрее всегда.
тем более что затык в этом месте.
Записан
RSATom
Гость
« Ответ #20 : Ноябрь 13, 2014, 10:04 »

проблема в том что для того чтобы использовать memcpy в связке с  std::vector необходимо предварительно сделать тем или иным способом resize для вектора, а это сопровождается overhead в виде инициализации элементов вектора неким значением. Поэтому единственный вариант скопировать буфер в std::vector - это range insert в том или ином его виде, с надеждой на то что компилятор оптимизирует это до memcpy...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #21 : Ноябрь 13, 2014, 10:14 »

проблема в том что для того чтобы использовать memcpy в связке с  std::vector необходимо предварительно сделать тем или иным способом resize для вектора, а это сопровождается overhead в виде инициализации элементов вектора неким значением.
А в чем проблема? Там идет memset, который тоже быстро выполняется.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
RSATom
Гость
« Ответ #22 : Ноябрь 13, 2014, 10:19 »

memset конечно быстр - но в данном случае это overhead. т.к. заполненные одними значениями элементы тут же затираются другими. в 99% случаев этот overhead не критичен, а порой вообще не заметен - но он есть.
Записан
vulko
Гость
« Ответ #23 : Ноябрь 13, 2014, 10:46 »

memset конечно быстр - но в данном случае это overhead. т.к. заполненные одними значениями элементы тут же затираются другими. в 99% случаев этот overhead не критичен, а порой вообще не заметен - но он есть.

оверхед есть и от обращения к vtable и от создания вектора и его инициализации.

если это место нагружено, значит лучше максимально его уменьшить и перейти на char* + memcpy.
никаких преимуществ использования вектора в данной ситуации нет.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #24 : Ноябрь 13, 2014, 10:56 »

А еще можно на асме вставку сделать...
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
vulko
Гость
« Ответ #25 : Ноябрь 13, 2014, 11:09 »

А еще можно на асме вставку сделать...

это перебор. char* + memcpy будет итак летать...)))
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #26 : Ноябрь 13, 2014, 11:12 »

А еще можно на асме вставку сделать...

это перебор. char* + memcpy будет итак летать...)))
Я к тому, что низкоуровневые варианты стоит использовать только в тех случаях, когда текущего уровня становится недостаточно. ИМХО, для начала ТС следует воспользоваться вариантом с вектором и посмотреть, не будет ли это достаточным.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #27 : Ноябрь 18, 2014, 09:42 »

В отличии от
Код
C++ (Qt)
std::vector<char> tmp(b.begin(), b.end());
   return tmp;
 
где происходит следующее: сначала будет создан объект tmp с вызовом конструктора, затем копирующий конструктор скопирует tmp в область памяти вне функции. Далее, для tmp будет вызван деструктор.
Так делает MSVC и только в Debug, т.е. это просто "отклонение от нормы", разницы между 2 вариантами нет. 

Не знал раньше про rvo и nrvo. Было интересно.
На мой взгляд оптимальным вариантом будет использование memcpy. Быстрее него всё равно ничего не напишешь. И голова не болит о том, как и какая строчка будет воспринята каким-либо компилятором. Или я ошибаюсь?
memcpy не годится для типов с нетривиальным копированием. Вообще почитаешь - душа радуется, как люди заботятся о скорости! Улыбающийся Увы, это пока так, "разговор ни о чем". Третьего дня столкнулся с такими тормозами

Код
C++ (Qt)
void DoSomething( const std::vector <CData *> & data );
 
Разумеется ф-ция DoSomething имеет очень хорошую частоту вызова (мульены). Известно что вектор data может иметь одинаковые эл-ты и нужно пропускать повторы, но как это сделать? Очевидное решение QHash заметно тормозит, время уходит на создание/инициализацию хеша. Это нормально если число эл-тов сотня, но не 3-4 (как может быть).

Предвкушаю взрыв энтузиазма, огромное число дельных советов и.т.п. или... я ошибаюсь?  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #28 : Ноябрь 18, 2014, 17:07 »

а если линейный список создать из вектора?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #29 : Ноябрь 18, 2014, 19:06 »

а если линейный список создать из вектора?
Нет проблем, можно сразу делать список, ну так что с того, как/чем это поможет?
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.169 секунд. Запросов: 23.