В целом (или из вашего опыта) существует ли разница в производительности между циклами for и while?
Что делать, если они дважды/трижды вложены?
Является ли векторизация (SSE) затронутой вариантом цикла в g++ или компиляторах Intel?
Спасибо
В целом (или из вашего опыта) существует ли разница в производительности между циклами for и while?
Что делать, если они дважды/трижды вложены?
Является ли векторизация (SSE) затронутой вариантом цикла в g++ или компиляторах Intel?
Спасибо
Здесь - хорошая статья по этому вопросу.
Любой интеллектуальный компилятор не будет показывать разницу между ними. Цикл for
- это действительно просто синтаксический сахар для определенной формы цикла while
. В любом случае.
это должно быть незначительным. оптимизирующий компилятор должен сделать различие несуществующим.
Это легко понять, посмотрев на разборку. Для большинства циклов они будут одинаковыми при условии, что вы выполняете ту же работу.
int i = 0;
while (i < 10)
++i;
совпадает с
for (int i = 0; i < 10; ++i)
;
Что касается вложенности, это действительно зависит от того, как вы его настроите, но те же настройки должны давать одинаковый код.
Должно быть нулевое различие, но проверьте, как я видел действительно дрянные, более старые версии GCC создают другой код ARM/Thumb код между ними. Один из них оптимизировал сравнение после вычитания, чтобы установить флаг нуля, а другой - нет. Был очень хромой.
Вложение снова не должно иметь никакого значения. Не уверен в материалах SSE/Vectorization, но опять же я ожидаю, что не будет никакой разницы.
VS2015, Intel Xeon CPU
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