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

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

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

Сообщений: 4727



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

сразу создать связи между неповторяющимися элементами, должно быть быстрее хеша по идее (диванная аналитика)
Записан

Изучением 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


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

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

Сообщений: 4727



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

может я не так выразился Улыбающийся ну самый обычный линейный связный список:
Код
C++ (Qt)
struct Node
{
   Node *next; // можно и previous добавить по желанию
   CData *data;
};
 
struct LinkedList
{
   Node *head, *current;
};
Записан

Изучением 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
kamre
Частый гость
***
Offline Offline

Сообщений: 233


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

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

P.S. QHash тут вроде совсем не нужен.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

может я не так выразился Улыбающийся ну самый обычный линейный связный список:
Все равно не понял. Ну завел, и что?

1. Добавить флаг того, что элемент обработан, в CData. На входе у всех элементов из data флаг сброшен, на выходе из DoSomething сбрасывать эти флаги.
Несомненно лучшее, но что делать с multi-threaded? Пользователи с 32 ядрами - уже дело рядовое, так что QAtomicInt не обойтись

2. Сортировать data перед обработкой и обрабатывать только первый из подряд идущих одинаковых указателей.
Не проверял, но сортировка - операция совсем не дешевая, возможно это будет "лучше хеша", но тормоз останется.

3. Не передавать дубликаты, а отсеивать их на уровне выше. Например, если исходные CData лежат в каком-то векторе, то у них есть индекс в этом векторе, можно завести вектор из флагов и при сборке data учитывать эти флаги.
Не очень понял. Расскажу откуда берутся повторы. Нужно (всего лишь) найти все пересечения полигонов в сцене. Сделал окто-дерево и добавил в него все полигоны. Теперь иду полигон за полигоном и смотрю какие ноды дерева он покрывает. Все полигоны этих нодов собираю в вектор. DoSomething считает пересечение текущего полигона со всеми из вектора. За счет того что полигон имеет протяженность, он может оказаться в 2 и более нодах - вот и повторы.

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



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

может я не так выразился Улыбающийся ну самый обычный линейный связный список:
Все равно не понял. Ну завел, и что?
список состоит сразу из неповторяющихся элементов, ничего пропускать не нужно — просто выполняется переход в node->next и все. либо я чего-то не понял в вопросе.
Записан

Изучением 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


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

список состоит сразу из неповторяющихся элементов, ничего пропускать не нужно — просто выполняется переход в node->next и все.
Ну вот есть CData * что нужно добавить. Хорошо, создал Node *, добавил его в список, но как проверить что такой CData * в списке уже есть? А если без Node, держать next  в самом CData - не раскрутиться с multi-threading

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

Сообщений: 4727



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

я почему-то подумал, что одинаковые элементы идут подряд...

тогда флаг статуса обработки можно ставить не в саму Cdata, а в какой-то менеджер. но это диванная аналитика-2 т.к. с многопоточностью дела практически не имел.
Записан

Изучением 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
kamre
Частый гость
***
Offline Offline

Сообщений: 233


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

Не очень понял. Расскажу откуда берутся повторы. Нужно (всего лишь) найти все пересечения полигонов в сцене. Сделал окто-дерево и добавил в него все полигоны. Теперь иду полигон за полигоном и смотрю какие ноды дерева он покрывает. Все полигоны этих нодов собираю в вектор. DoSomething считает пересечение текущего полигона со всеми из вектора. За счет того что полигон имеет протяженность, он может оказаться в 2 и более нодах - вот и повторы.
Имелось ввиду то, что полигоны лежат в векторе, а их индексы в окто-дереве используются. Также есть массив флагов такой же длины как и вектор полигонов. При сборке полигонов с узлов дерева выставляются флаги и тем самым избегаются дубликаты в собранном векторе. После вызова функции DoSomething флаги сбрасываются.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Имелось ввиду то, что полигоны лежат в векторе, а их индексы в окто-дереве используются. Также есть массив флагов такой же длины как и вектор полигонов. При сборке полигонов с узлов дерева выставляются флаги и тем самым избегаются дубликаты в собранном векторе. После вызова функции DoSomething флаги сбрасываются.
Только массив флагов двумерный (или свой на каждую нитку). Так да, быстро и без atomic. Я не додумался.

Спасибо
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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