![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| avn |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
Добрый день!
Решил сравнить чем быстрее заполнять массив - циклом, шаблонной функцией или шаблонным классом? Если вкратце - циклом оказалось таки быстрее Ну а теперь - эксперимент. Машина AMD Athlon 64 3000 1.81 GHz, 1.0 G RAM. Стоит Windows XP Profesional SP2. IDE - VC++2008. Определен массив из long double arr[256]. Вначале думал выбрать 512 MB, но VC стал ругаться - не хватает памяти для разворота рекурсии Циклический метод:
Метод шаблонной рекурсивной функции:
Метод заполнения шаблонным рекурсивным классом:
Измерение производится следующим образом: - повышаем приоритет потока и процесса до максимума; - в цикле из 10240 раз замеряем время до входа в функцию, потом функция, потом время выхода. Измерение производится с помощью QueryPerformanceCounter; - даем системе 1мс обработать другие потоки - берем среднее арифметическое из всех этих функций. Итог у меня получился такой:
Для меня он оказался немного неожиданным, но, изучил дизассемблированный код, все стало на свои места. |
||||||||
|
|||||||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ну еще-бы, в первом случае - простая итерация - заполнение массива
во втором и третьем случае, помимо заполнения массива будет расти стек |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Что-то вы напутали.
Первый пример выполняется на стадии работы программы. Второй и третий - во время компиляции. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
Ежели стрелять из пушки по воробьям, то попасть очень сложно. При том расходы колоссальные.
-------------------- ![]() |
|||
|
||||
| Lazin |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
садись - два кстати, "Метод шаблонной рекурсивной функции" может быть сведен компилятором вообще, к N присваиваний, если ф-я будет встроена, что, если подсказать ему директивой __forceinline? Добавлено через 2 минуты и 54 секунды
ты хоть понимаешь, что твой код будет делать, и какого размера будет exe-шник, при достаточно большом размере массива? Добавлено через 4 минуты и 19 секунд
это я сказал специально для сто двадцать первого, что-бы он не обижался, что я только на него наезжаю |
||||||
|
|||||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Почему? Разве это выполняется не во время компиляции? Т.е. код генерируется. Добавлено @ 12:45 в основном так и есть. Это сообщение отредактировал(а) andrew_121 - 13.8.2009, 12:53 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Я это и имел ввиду. Просто по другому выразился. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
||||
|
||||
| GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
avn,
сравни заодно с этим
и с этим
Добавлено @ 13:26 еще можно
Это сообщение отредактировал(а) GoldFinch - 13.8.2009, 13:29 |
||||||
|
|||||||
| avn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
GoldFinch, ну чего сразу же бред??? Вот тут человек пытается заполнить таблицу CRC методом шаблонных классов - именно эта статья меня и натолкнула на идею сравнить производительность разных методов.
А дизасм я не выложил, т. к. я смотрел в своем IDE. Да и длинноват он будет... Кто хочет, сам может все увидеть. Cheloveck, стрелять по воробьям из пушки - это мастер-класс стрельбы, если попал Lazin, я как-то сразу не подумал о том, что размер массива порождает линейный рост программы. Но в том и состоит прелесть эксперимента - увидел - проанализировал - учел на будущее! И вообще - я считаю, что полезно в в разделе "С++ для новичков" проводить такие небольшие исследования, чтобы люди лучше понимали, как и что работает. GoldFinch, по поводу твоего кода - ща попробую Это сообщение отредактировал(а) avn - 14.8.2009, 12:25 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
| avn |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
GoldFinch, попробовал. Получилось следующее:
ИТОГ: алгоритм FOR с итератором работает слегка быстрее, чем просто FOR. По ходу разных запусков получалось, что иногда быстрее, иногда медленнее. Но, в общем, очень близко. Ну а использование std::generate - кхм, не очень Добавлено через 4 минуты и 28 секунд
Ну-у, в этой области я пока что новичок - разбираюсь, изучаю - посему и в разделе для новичков |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
avn, полный код тестовой программы выложи, и опции компилятора
чтото результаты сомнительные Добавлено @ 13:45
у нас нет твоего тестового кода, и настроек компиляции, так что сами ничего не увидим Это сообщение отредактировал(а) GoldFinch - 14.8.2009, 13:45 |
|||
|
||||
| GoldFinch |
|
||||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
ну да, все как я и думал.
avn, у тебя наверное были включены проверки времени выполнения STL (надо /GS-), поэтому код с STL получился медленным мой тестовый код
результат:
код с лямбдой всегда быстрее, т.к. там там тест-код оптимальнее, 1 операция против 2х Добавлено @ 14:30 а вот так выглядят дизасмы, код c for
код с лямбдой:
Это сообщение отредактировал(а) GoldFinch - 14.8.2009, 14:34 |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |