Производительность C ++, по сравнению с временем - PullRequest
12 голосов
/ 21 мая 2010

В целом (или из вашего опыта), есть ли разница в производительности между циклами for и while?

Что если они вложены вдвойне / втрое?

Векторизация (SSE) зависит от варианта цикла в компиляторах g ++ или Intel?

Спасибо

Ответы [ 6 ]

15 голосов
/ 21 мая 2010

Здесь - хорошая статья на эту тему.

9 голосов
/ 21 мая 2010

Любой интеллектуальный компилятор не будет действительно показывать разницу между ними. Цикл for на самом деле просто синтаксический сахар для определенной формы цикла while, в любом случае.

1 голос
/ 28 сентября 2017

VS2015, процессор Intel Xeon

long long n = 1000000000;
int *v = new int[n];
int *v1 = new int[2*n];

start = clock();
for (long long i = 0, j=0; i < n; i++, j+=2)
    v[i] = v1[j];
end = clock();
std::cout << "for1 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;

p = v; pe = p + n; p1 = v1;
start = clock();
while (p < pe)
{
    *p++ = *p1;
    p1 += 2;
}
end = clock();
std::cout << "while3 - CPU time = " << (double)(end - start) / CLOCKS_PER_SEC << std::endl;

for1 - время процессора = 4,055

while3 - время процессора = 1,271

1 голос
/ 21 мая 2010

Должна быть нулевая разница, но проверьте, как я видел, действительно дрянные, старые версии GCC создают разные коды ARM / Thumb между двумя. Один оптимизировал сравнение после вычитания, чтобы установить нулевой флаг, а другой - нет. Был очень хромым.

Повторное вложение не должно иметь никакого значения. Не уверен насчет SSE / векторизации, но, опять же, я ожидаю, что разницы не будет.

1 голос
/ 21 мая 2010

Это легко узнать, взглянув на разборку. Для большинства циклов они будут одинаковыми при условии, что вы выполняете одинаковую работу.

int i = 0;
while (i < 10)
   ++i;

совпадает с

for (int i = 0; i < 10; ++i)
   ;

Что касается вложения, это действительно зависит от того, как вы его настраиваете, но одни и те же настройки должны давать тот же код.

0 голосов
/ 21 мая 2010

должно быть незначительным. оптимизирующий компилятор должен сделать различие несуществующим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...