![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здравствуйте.
Потребовалось тут недавно сделать несложную функцию, которая XOR-ит два массива, AND-ит результат с третьим и OR-ит результат в одну переменную. Короче так:
потом решил немного по...вы..делываться и сделал то же самое на STL, только с тремя циклами (один на XOR, второй на AND, третий на аккумулирование). В результате код на STL работает в 6...7 раз медленнее. Подскажите, в чём я не прав. Или это - нормально, а просто не следует сдуру пихать алгоритмы STL во все дыры ? Вот код:
http://liveworkspace.org/code/366eb1fa8b05...cd9d50b5a3ab4e1 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
три цикла содержат больше вычислений. а если массивы достаточно большие, то гораздо больше перезагрузек кэша, так что 6-7 раз вполне нормально.
это не STL плохой, просто задача на 3 цикла действия естественным образом не распадается, это рождение напряженной мысли)) в крайнем случае можно было создать из Ваших трех функций общую функцию (a^b)&c и запихнуть её в accumulate. цикл был бы один и тяга к обобщениям удовлетворена. |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
borisbn, не поверите. Взял ваш код. Ничего не менял (код брал на liveworkspace).
Скомпилял на студии 2008. Результат :
Прогонял несколько раз. Цифры чуток менялись, но ничего кардинального. на всякий случай комм. строка (оптимизация)
вывод... ![]() Это сообщение отредактировал(а) volatile - 7.11.2011, 11:57 |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
volatile, отформатируй плиз строку компилятора. а то экран зашкаливает.
Добавлено через 2 минуты и 45 секунд увеличил в 10 раз, но для gen_version() время равно нулю. есть подозрение, что GCC вовсе вырезал тело этой функции. щас проверю.. |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так и есть. компилятор вырезал оба вызова gen_version()
![]() раньше я уже подымал подобный вопрос. мало того что gen_version() является pure function, так ты еще и возвращаемое значение не проверяешь. поэтому компилятор вполне логично предположил, что функцию можно запросто вырезать. и ведь он не ошибся, все равно никто до сих пор не заметил что она пропала. ![]() подкорректировал код так:
http://liveworkspace.org/code/022bb5fb7940...b9ff27ebeff3f95 на LWS оптимизация отключена, поэтому такие огромные расхождения. вот мои результаты. gcc-4.5.2, linux.
странно то, что STL версия почти всегда выполняется быстрее. Это сообщение отредактировал(а) boostcoder - 7.11.2011, 04:18 |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Фишка STL в том, что он дебаговой версии много чего проверяет, что делает отладку более простой, а код безопаснее, тогда как в релизе получается, как правило, тоже что и при использовании простого массива.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Спасибо всем отписавшимся (о_О... и это при том, что я запостил в 3 часа ночи МСК)
для этого нужно создать структуру, в которую записать a, b и c, и сделать вектор этих структур, а мне это архинеудобно
хммм. не знал, что отключена... сорри за оффтоп, но как-то экспериментировал с move semantics на LWS ( http://liveworkspace.org/code/ad3e28d4a554...cdfe13a7b58d551 ) и решил, что оптимизация там включена (не выводится trace для переменной result и для move-конструктора). думаю, это из-за того, что в general-версии вызывается operator[], а в STL-версии - просто ++iter. Ну, это понятно. Я просто не знал, что на LWS отключена оптимизация. Всем ещё раз спасибо. Закрываю. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
volatile, спасибо. все гут.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
в Str operator+( const Str & other ) const; создаётся переменная Str result; так вот, судя по выводу, её конструктор/деструктор не вызывается. Смотри: в main() создаётся 3 переменных (x, y и z) плюс одна переменная result в операторе +, а выводится в cout trace всего из 3-х деструкторов и 3 варианта this. по голове не бить ![]() неа. это в воскресенье было. дома компилятор не установлен. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так у тебя в коде отступы в 4 пробела. ты что, руками на space жал? ![]() ибо на LWS работает Tab, но отступы в 3 пробела. позже. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
гы... маленькая хитрость - при переводе строки на LWS отступ делается на 3 символа, но за курсором остаётся ещё один пробел, так что выровняться по 4 - это просто нажать вправо. А если нужно увеличить отступ, то я уже привык на LWS жать Tab, а затем пробел ![]() жду. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
borisbn, на сколько я понял из того что нагуглил, для получения move semantics нужно использовать std::move(), ибо в противном случае, компилятор не сможет выбрать сам какой способ использовать, конструкцию с константной ссылкой, или все же move semantics. т.к. первое не сказывается на вызывающий код, а второе сказывается.
http://liveworkspace.org/code/ac113d3f5dab...2f0adb2ed7c57bd а вообще, по моему вопросов появилось еще больше. нужно создать отдельную тему по поводу move semantics. Добавлено через 2 минуты и 34 секунды
вот: http://liveworkspace.org/code/dc9fa6e85268...d5669c31c95a4a4 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нет, move нужно использовать, тогда когда применение move- семантики не очевидно компилятору.. в остальных он сделает сам.. Добавлено через 2 минуты и 53 секунды ![]() Добавлено через 4 минуты и 1 секунду наверно код надо смотреть, там много букв позже гляну.. или подожду обещанной новой темы.. тем более что самому хочется до конца разобраться с этим нововведением.. |
|||
|
||||
Lols |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 21.10.2011 Репутация: нет Всего: нет |
Интересно вы по...выделывались
![]() Я так понимаю, что нужно было просто убрать тело функции? (за ненадобностью ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
очень даже может быть. кому нужно? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
baldina, это-то я хорошо понимаю. мне была не понятна ситуация с деструкторами перемещенных объектов.
читать тут: http://forum.vingrad.ru/forum/topic-341389.html |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |