![]() |
|
Модераторы: bsa |
![]()
|
|
| avn |
|
||||||||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
Доброго времени суток и с Новым Годом!
Копаясь в своих старых программах, обнаружил subject. Может, кому-то будет полезно... Я решил измерить время заполнения массива различными способами. Сравнение я решил выполнить командой RDTSC. Измерение делалось следующим образом: 1) взяли RDTSC 2) пропустили цикл из 1 000 000 заполнений массива дробных чисел размером в 256 элементов 3) замерили RDTSC и разделили на кол-во итераций цикла Характеристики машины: Pentium Dual-Core E5500 (2.8GHz), 2GB, WinXP.Prof.SP2 Результаты получились следующие:
Способ FOR (offset):
Способ std::generate:
Способ templated function:
Способ templated class:
Способ std::generate + boost::lambda:
Способ FOR (vector, iterator):
Способ FOR (list, iterator):
А вот и полный текст программы. Ее можно легко реконфигурировать, манипулируя #define-ми Добавлено @ 13:07
Это сообщение отредактировал(а) avn - 5.1.2011, 13:09 |
||||||||||||||||||
|
|||||||||||||||||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
Это типа в релизе? Чем компилил?
|
|||
|
||||
| Estranged |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
Программа будет грешить слегка, процессор выполняет еще тысячи прерываний в секунду, отчего счетчик тактов слегка раздувает реальные показатели выполнения.
|
|||
|
||||
| avn |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
Компилил в Microsoft Visual Studio 2008 Добавлено через 1 минуту и 36 секунд
Это понятно Но, насколько я знаю, для ОТНОСИТЕЛЬНОГО сравнения RDTSC - самая доступная точная вещь. А проблему прерываний я решаю статистически - думаю, за 1e6 итераций * 256 элементов массива роль единичных прерываний уже несущественна. |
||||
|
|||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
я по два раз, два раза не повторяю, не повторяю |
|||
|
||||
| Estranged |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
------------------------
-- -- Filling array [256] 1000000 times: -- -- FOR (offset): average 5.3 (val 1.360000e-004) -- std::generate: average 5.3 (val 1.360000e-004) -- FOR (pointer): average 5.3 (val 1.360000e-004) -- templated function: average 2.6 (val 1.360000e-004) -- templated class: average 2.6 (val 1.360000e-004) -- FOR (vector, iterator): average 5.3 (val 1.360000e-004) -- FOR (list, iterator): average 7.9 (val 1.360000e-004) -- ------------------------ Релиз в MS VS 2010. Процессор AMD Phenom II 3000 Ггц. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
|
|||
|
||||
| sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
|
|||
|
||||
| avn |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 25.10.2005 Репутация: нет Всего: нет |
Интересно, что тут соотношение не такое, как у меня. Почему варианты templated обрабатываются в 2 раза быстрее, чем FOR??? Или все дело в компиляторе? У меня VS 2008. Alca - да, релиз |
|||
|
||||
| Estranged |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 30.8.2010 Репутация: нет Всего: 3 |
avn, потому что FOR - цикл, предсказание ветвлений может ошибаться. А templated развернулись в линейный код типа
загрузить в arr [0] значение X загрузить в arr [1] значение X загрузить в arr [2] значение X загрузить в arr [3] значение X ... Это сообщение отредактировал(а) Estranged - 11.1.2011, 19:24 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
От компилятора тоже многое зависит. Еще больше зависит от уровня оптимизации при компиляции. Если интересно, что получается при компиляции шаблонов - включи генерацию ассемблерного кода и смотри. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |