![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Nitro89 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 18.3.2005 Репутация: нет Всего: нет |
Даны функиции:
И другая, аналогичная ей.
Так вот, по-вашему должна сработать быстрее, и почему. Я думал, что скорость одинаковая, хотя при одной из проверок, разница в скорости оказалась существенной. (хотя может компилиятор оптимизировал плохо). |
||||
|
|||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
ассемблерный код для обеих функций генерится, конечно, разный. в случае с обращением к элементу массива добавляется возня с индексом. но как ни странно, у меня обе функции показали одинаковые результаты. при строчке длиной в 300 мег обе функции в 10-кратном цикле отработали за 10 секунд каждая. может быть, компилятор хорошо отоптимизировал?
Это сообщение отредактировал(а) blackofe - 30.12.2005, 22:22 |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Скорость в данном случае естественно ограничивается I/O. Но при прочих равных, у компилятора больше возможностей для оптимизации первого цикла - потому что он может быть уверен, что там нет алиасинга, и, к примеру, векторизовать его.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Я попробовал эту программу в VC71, в релизе, с оптимизацией MaxSpeed.
Если я правильно понял, то компилятор одну функцию вообще исключил, и оба раза вызвал только одну из них. Поэтому, видимо, можно утверждать, что они эквивалентны
Не понял --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Алиасинг - это ситуация, когда на одну и ту же область памяти ссылаются разные переменные. Вызывает затруднения у оптимизатора, поскольку он не может распараллелить обращения к ним. Во втором случае компилятору гораздо труднее понять семантику цикла. А в первом - все ясно: v[i] при разных i ссылаются на разные области памяти. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| WolfON |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 604 Регистрация: 19.7.2004 Репутация: нет Всего: 8 |
Хороший компилятор для первого и второго случая должен сгенерировать тождественный код.
Читаем Страуструпа - там точно такой-же пример. |
|||
|
||||
| Nitro89 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 18.3.2005 Репутация: нет Всего: нет |
Я оттуда и взял.... Просто хотел более подробного объяснения почему так происходит. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |