Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Cкорость выполнения


Автор: Nitro89 30.12.2005, 21:21
Даны функиции:
Код

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<<' ';
}

Так вот, по-вашему должна сработать быстрее, и почему. Я думал, что скорость одинаковая, хотя при одной из проверок, разница в скорости оказалась существенной. (хотя может компилиятор оптимизировал плохо).

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

Автор: Void 30.12.2005, 23:19
Скорость в данном случае естественно ограничивается I/O. Но при прочих равных, у компилятора больше возможностей для оптимизации первого цикла - потому что он может быть уверен, что там нет алиасинга, и, к примеру, векторизовать его.

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

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

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


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

Не понял smile Что такое алиасинг и почему его там нет smile

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

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

Автор: WolfON 31.12.2005, 14:52
Хороший компилятор для первого и второго случая должен сгенерировать тождественный код.

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

Автор: Nitro89 2.1.2006, 15:51
Цитата

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

Я оттуда и взял.... Просто хотел более подробного объяснения почему так происходит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)