Производительность C++, на какое-то время


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

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

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

Спасибо

6 11

6 ответов:

Вот Хорошая статья на эту тему.

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

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

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

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

То же самое, что

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

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

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

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

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-CPU time = 4,055

While3-CPU time = 1.271