Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Авварон |
15.2.2013, 18:44
Сообщение
#41
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0
|
То есть тест вы так и не скачали и не посмотрели?
Да, какие еще ограничения добавите? upd: прогнал и этот тест. Чуть лучше для std - std::vector и QVector равны по всем параметрам; QList чуть медленнее аппендит, гораздо быстрее препендит и рандомная вставка у Кулиста чуть лучше. Не вижу, почему вы считаете использование QString'а в тесте "несостоятельным" - контейнеры, содержащие строки достаточно распространены, не использовать же на каждый чих контейнеры с указателями на строки? Сообщение отредактировал Авварон - 15.2.2013, 19:05 |
|
|
|
|
Алексей1153 |
15.2.2013, 19:07
Сообщение
#42
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Авварон @ 15.2.2013, 21:44) Link почему вы считаете использование QString'а в тесте "несостоятельным" где я такое писал ? а разница в том, что указатель - простой тип - будет копироваться в векторе тем самым memmove (сразу вся перемещаемая часть указателей то есть). А QString - оператором =. И фиг с ним, с QString , я его всегда с удовольствием применяю даже в stl-контейнерах. Самое неприятное, когда элемент содержит указатели на динамические объекты - и возня с копированием ичень достаёт. Проще просто указатели в векторе/мапе и хранить |
|
|
|
|
Авварон |
15.2.2013, 19:41
Сообщение
#43
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0
|
В том-то и вся фишка, что для QString не используется operator=, отсюда и разница в производительности в 10раз. Из-за шаред даты внутри QString QList/QVector используют memmove для ЛЮБЫХ типов Qt, основанных на COW (так как они являются перемещаемыми). Более того, вы можете применять эту оптимизацию это для своих типов при помощи макроса Q_DECLARE_TYPEINFO.
|
|
|
|
|
Алексей1153 |
15.2.2013, 20:33
Сообщение
#44
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Авварон @ 15.2.2013, 22:41) Link В том-то и вся фишка, что для QString не используется operator=, отсюда и разница в производительности в 10раз. Из-за шаред даты внутри QString QList/QVector используют memmove для ЛЮБЫХ типов Qt, что за сказки |
|
|
|
|
Авварон |
16.2.2013, 0:03
Сообщение
#45
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0
|
Всё дело в том, что у QString'а в хедере есть следующий код:
благодаря которому QVector/QList "узнают" о том, что QString можно является movable и его можно перемещать меммувом. На всякий случай приведу код, его должно быть достаточно для понимания, как оно работает: Раскрывающийся текст Вы легко можете проверить сами, является ли тип статичным (то есть то, что он НЕ примитивен и НЕ мувабл):
|
|
|
|
|
__ilya__ |
16.2.2013, 12:37
Сообщение
#46
|
|
Студент ![]() Группа: Участник Сообщений: 57 Регистрация: 19.1.2012 Пользователь №: 3143 Спасибо сказали: 0 раз(а) Репутация: 0
|
в общем два вектора соеденяются так: Правильно? |
|
|
|
|
Алексей1153 |
16.2.2013, 16:33
Сообщение
#47
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Авварон, ну QString, по сути, и есть один указатель, так что различия с вектором нет, если там применять указатели так же. В MFC раньше похоже был устроен CString , но потом его зашаблонили ))
__ilya__, так попробуй и всё, это же быстрее ) |
|
|
|
|
Авварон |
17.2.2013, 10:32
Сообщение
#48
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0
|
Цитата(Алексей1153 @ 16.2.2013, 17:33) Link Авварон, ну QString, по сути, и есть один указатель, так что различия с вектором нет, если там применять указатели так же. Это правда, но различие в том, что в QVector есть эта оптимизация, а в std::vector нету. А писать std::vector<QString*> не очень удобно |
|
|
|
|
Алексей1153 |
17.2.2013, 12:30
Сообщение
#49
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2946 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34
|
Цитата(Авварон @ 17.2.2013, 13:32) Link А писать std::vector<QString*> не очень удобно я знаю про особенность QString, поэтому пишу std::vector<QString> |
|
|
|
|
Авварон |
17.2.2013, 13:30
Сообщение
#50
|
![]() Студент ![]() Группа: Участник Сообщений: 99 Регистрация: 26.4.2009 Пользователь №: 709 Спасибо сказали: 14 раз(а) Репутация: 0
|
Цитата(Алексей1153 @ 17.2.2013, 13:30) Link Цитата(Авварон @ 17.2.2013, 13:32) Link А писать std::vector<QString*> не очень удобно я знаю про особенность QString, поэтому пишу std::vector<QString> Вы-то знаете, а вот std::vestor - нет, и он будет использовать оператор= вместо меммува. |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 9.1.2026, 20:22 |