Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cкорость выполнения, Сравнение двух функций 
:(
    Опции темы
Nitro89
Дата 30.12.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.3.2005

Репутация: нет
Всего: нет



Даны функиции:
Код

void f(char v[]) // c-строка
{
for(int i=0; v[i]!=0; /*c-строка заканчивается нулем*/; i++) std::cout<<v[i]<<' ';
}

И другая, аналогичная ей.
Код

void g(char v[])
{
for(char* p=v; *p!=0; p++) std::cout<<*p<<' ';
}

Так вот, по-вашему должна сработать быстрее, и почему. Я думал, что скорость одинаковая, хотя при одной из проверок, разница в скорости оказалась существенной. (хотя может компилиятор оптимизировал плохо).
PM MAIL ICQ   Вверх
blackofe
Дата 30.12.2005, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



ассемблерный код для обеих функций генерится, конечно, разный. в случае с обращением к элементу массива добавляется возня с индексом. но как ни странно, у меня обе функции показали одинаковые результаты. при строчке длиной в 300 мег обе функции в 10-кратном цикле отработали за 10 секунд каждая. может быть, компилятор хорошо отоптимизировал? smile к слову, я проверял это в конфигурации debug при выключенной оптимизации.

Это сообщение отредактировал(а) blackofe - 30.12.2005, 22:22
PM MAIL   Вверх
Void
Дата 30.12.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λ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
PM MAIL WWW GTalk   Вверх
LPBOY
Дата 30.12.2005, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Я попробовал эту программу в VC71, в релизе, с оптимизацией MaxSpeed.
Код

int main()
{
    char v[] = "Hello world!";
    f(v);
   g(v);
}

Если я правильно понял, то компилятор одну функцию вообще исключил, и оба раза вызвал только одну из них. Поэтому, видимо, можно утверждать, что они эквивалентны smile.


Цитата(Void @ 30.12.2005, 23:19)
потому что он может быть уверен, что там нет алиасинга

Не понял smile Что такое алиасинг и почему его там нет smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Void
Дата 31.12.2005, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(LPBOY @ 31.12.2005, 01:38)
Не понял smile Что такое алиасинг и почему его там нет

Алиасинг - это ситуация, когда на одну и ту же область памяти ссылаются разные переменные. Вызывает затруднения у оптимизатора, поскольку он не может распараллелить обращения к ним. Во втором случае компилятору гораздо труднее понять семантику цикла. А в первом - все ясно: v[i] при разных i ссылаются на разные области памяти.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
WolfON
Дата 31.12.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Хороший компилятор для первого и второго случая должен сгенерировать тождественный код.

Читаем Страуструпа - там точно такой-же пример.
PM MAIL ICQ   Вверх
Nitro89
Дата 2.1.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 18.3.2005

Репутация: нет
Всего: нет



Цитата

Читаем Страуструпа - там точно такой-же пример.

Я оттуда и взял.... Просто хотел более подробного объяснения почему так происходит.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.