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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: QList::insert (multi)  (Прочитано 30457 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #45 : Октябрь 07, 2018, 18:29 »

Хмм.. ну допустим ее нет, что бы Вы предложили взамен? QVector что ли? Это по меньшей мере столь же спорно. Или как? Лично я лучшего не вижу. Ладно, рассмотрим пример совершенно неверного применения QList

Да, кувектор. У него нет проблем кулиста.
Но лучше конечно std::vector, он и умеет больше и бинарного кода генерит меньше (навеяно недавним холиваром в геррите когда я менял QVector на std::vector)
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #46 : Октябрь 07, 2018, 19:47 »

Бенчмарк  вставки в середину стд и кути листа, показывает монопенисуальное время, даже последний на пару % быстрее.

Код бенчмарка показать бы, чтоб посмотреть, что именно сравнивается.
Простите, был сильно не прав. QList сильно в опе.

Код:
for (int i = 0; i < 100000; ++i)
    stdIt = stdList.insert(stdIt, QUuid::createUuid());
for (int i = 0; i < 100000; ++i)
    qtIt = qtList.insert(qtIt, QUuid::createUuid());
180мс std против 1540мс Qt

Беда печаль...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #47 : Октябрь 07, 2018, 20:06 »

(навеяно недавним холиваром в геррите когда я менял QVector на std::vector)

А ссылку можно напочитать?
Записан

ArchLinux x86_64 / Win10 64 bit
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #48 : Октябрь 07, 2018, 20:16 »

Беда печаль...
Вы же QList сравнивали не с std::list? Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #49 : Октябрь 07, 2018, 20:21 »

Простите, был сильно не прав. QList сильно в опе.

Код:
for (int i = 0; i < 100000; ++i)
    stdIt = stdList.insert(stdIt, QUuid::createUuid());
for (int i = 0; i < 100000; ++i)
    qtIt = qtList.insert(qtIt, QUuid::createUuid());
180мс std против 1540мс Qt

Беда печаль...

С бенчмарками не всё так просто. Если так "в лоб" писать пару тестов подряд в main, то бывает, что первый тормозит сильней просто потому, что первым выполняется Улыбающийся. Несколько раз с таким сталкивался, когда хотел на скорую руку пару вещей сравнить. И в теме изначально речь шла про вставку нескольких элементов "за раз". Попробуйте повставлять в середину 1000 раз по 100 элементов (размером больше чем int/указатель). Для std контейнеров используйте соответствующие методы для вставки диапазона. Для кутешных тоже можете, если найдёте Улыбающийся. Ну и сравнивать надо контейнеры, которые схожи по своему внутреннему устройству.
Записан

Пока сам не сделаешь...
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #50 : Октябрь 07, 2018, 20:31 »

Беда печаль...
Вы же QList сравнивали не с std::list? Улыбающийся
С ним. А надо было с чем то другим?

в объявлениях вот так было
Код:
std::list<QUuid> stdList{QUuid::createUuid(), QUuid::createUuid()};
QList<QUuid> qtList{QUuid::createUuid(), QUuid::createUuid()};
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #51 : Октябрь 07, 2018, 20:43 »

Это совершенно разные контейнеры. Вставку в QList можно сравнить со вставкой в std::vector.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #52 : Октябрь 08, 2018, 01:18 »

А ссылку можно напочитать?

https://codereview.qt-project.org/#/c/237051/
пруфы где-то в середине - меньше плюсового кода, меньше бинарного кода.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #53 : Октябрь 08, 2018, 11:25 »

Да, кувектор. У него нет проблем кулиста.
Но лучше конечно std::vector, он и умеет больше и бинарного кода генерит меньше (навеяно недавним холиваром в геррите когда я менял QVector на std::vector)
Вектор идеален для простых данных, но чем развесистее структура (эл-т), чем тяжелее ее копирование - тем он менее эффективен. Поэтому в общем случае QList - более верное (или более концептуальное) решение. Хотя конечно не идеальное, такого в общем случае просто нет.

Что касается "std::vector быстрее" - то вряд ли из этого что-то можно выжать, и вряд ли стоит мочить все QVector Улыбающийся  Проблемы практически всегда связаны с неоптимальным использованием конкретного контейнера (т.е. он здесь не к месту, нужен другой), а не с его реализацией. Но все-таки интересно где же насвистели "великие тролли"  Улыбающийся

А код/проект где? Но все равно, правильно сделали что репорт написали (нечего им расслабляться  Улыбающийся)

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

Сообщений: 11445


Просмотр профиля
« Ответ #54 : Октябрь 08, 2018, 11:32 »

Простите, был сильно не прав. QList сильно в опе.

Код:
for (int i = 0; i < 100000; ++i)
    stdIt = stdList.insert(stdIt, QUuid::createUuid());
for (int i = 0; i < 100000; ++i)
    qtIt = qtList.insert(qtIt, QUuid::createUuid());
180мс std против 1540мс Qt

Беда печаль...
Правомерное сравнение примерно такое
Код:
for (int i = 0; i < 100000; ++i)
    stdIt = stdVector.insert(stdIt, new(QUuid::createUuid()));
for (int i = 0; i < 100000; ++i)
    qtIt = qtList.insert(qtIt, QUuid::createUuid());
Еще лучше случайно выбирать точку вставки, а то все сводится к append (легкий жанр). И прогонов на одном запуске не 2, а хотя бы 6-8, а то, как указал ViTech, меряем кеш процессора.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #55 : Октябрь 08, 2018, 11:38 »

Да, кувектор. У него нет проблем кулиста.
Но лучше конечно std::vector, он и умеет больше и бинарного кода генерит меньше (навеяно недавним холиваром в геррите когда я менял QVector на std::vector)
Вектор идеален для простых данных, но чем развесистее структура (эл-т), чем тяжелее ее копирование - тем он менее эффективен. Поэтому в общем случае QList - более верное (или более концептуальное) решение. Хотя конечно не идеальное, такого в общем случае просто нет.

Для тяжелых объектов придумали мур-семантику которая сводит на нет весь профит от кулиста.
Также, есть проползал добавить trait "trivially relocatable" (поддерживается в eastl) чтобы можно было перемещать данные через memmove внутри вектора (как и делает QVector сейчас).
Ну то есть куда не глянь - кулист не делает ничего полезного, а только добавляет оверхед.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #56 : Октябрь 08, 2018, 11:40 »


А код/проект где? Но все равно, правильно сделали что репорт написали (нечего им расслабляться  Улыбающийся)



Божемой, всё по ссылке.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #57 : Октябрь 08, 2018, 14:40 »

Для тяжелых объектов придумали мур-семантику которая сводит на нет весь профит от кулиста.
Также, есть проползал добавить trait "trivially relocatable" (поддерживается в eastl) чтобы можно было перемещать данные через memmove внутри вектора (как и делает QVector сейчас).
Ну то есть куда не глянь - кулист не делает ничего полезного, а только добавляет оверхед.
Даже если допустить что, со всеми новшествами, перемещение "достаточно дешево" (на что всегда найдутся исключения) - суть не в этом. Как ссылаться/использовать объект? Наиболее простое - указатель. Но если объект в векторе - от винта. Приходится хранить индекс, но он не "самодостаточен", нужно знать и контейнер. А если в нем еще и вставки/удаления  - геморрой капитальный. QList и решает эту простую вещь. Делать вектор указателей чтобы "заякорить" данные без QList приходилось очень часто. Это не то чтобы "сложно", но лишние движения, от которых QList приятно избавляет.

Божемой, всё по ссылке.
Цитировать
- Дивись, синку, оце море
- Деееееееееееееееееееееее Непонимающий?
Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #58 : Октябрь 08, 2018, 17:18 »

Я ничего не понял Непонимающий
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #59 : Октябрь 08, 2018, 20:13 »

Цитировать
Я ничего не понял

Просто провайдеры блокируют этот ресурс.  Улыбающийся Наверное Igors об этом..

По теме, но там по ссылке вроде же нет по произвозводительности никаких преимуществ? Там только 640 байт экономии.. НЕ? Или я плохо читал? Улыбающийся
 

Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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