С++, для

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

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

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

Спасибо

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

совпадает с

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

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

Ответ 5

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

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

Ответ 6

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