Проблема: одна, очевидно, дополнительная строка кода ускоряет программу почти в два раза.gcc простая производительность петли арифметики
Это довольно сложно сформулировать исходную проблему, она исходит из алгоритма устранения ограничений границ. Итак, просто какой-то простой тест, который я не могу понять.
Очевидно, что дополнительная строка кода приводит к ускорению программы почти в два раза.
Существует следующий источник:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
long i = 0, a = 0, x = 0;
int up = 200000000;
int *values = malloc(sizeof(int)*up);
for (i = 0; i < up ; ++i)
{
values[i]=i % 2;
}
for (i = 0; i < up ; ++i)
{
x = (a & i);
#ifdef FAST
x = 0;
#endif
a += values[x];
}
printf ("a=%ld\n", a);
return 0;
}/*main*/
В этом примере значение «а» всегда равен 0. Линия х = 0; - дополнительно.
Но, (смотрите - НЕТ НИКАКИХ оптимизаций)
$ НКУ -O0 -o короткие short.c & & время ./short
а = 0
реальные 0m2.808s
0m2.196s пользователей
SYS 0m0.596s
$ НКУ -O0 -DFAST -o короткие short.c & & время ./short
а = 0
реальные 0m1.869s
пользователь 0m1.260s
SYS 0m0.608s
И это воспроизводимый на многих компиляторов/вариантов оптимизации и вариаций программы.
Кроме того, они действительно приводят к тому же самому ассемблерному кодексу, за исключением того, что он помещает этот глупый дополнительный 0 в какой-нибудь регистр! Например:
НКУ -S -O0 -DFAST short.c & & мв short.s shortFAST.s
НКУ -S -O0 short.c & & мв short.s shortSLOW.s
дифференциалов shortFAST.s shortSLOW.s
55d54
< MOVQ $ 0, -24 (% РСП)
И немного после - тот же эффект на некоторые (все, что я был в состоянии проверить) другие компиляторы/языки (в том числе Java JIT). Единственная вещь была разделена - архитектура x86-64. Был протестирован как на процессорах Intel, так и на AMD ...
Пожалуйста, никогда не проверяйте без оптимизации. Это похоже на то, что таймер Усэйн Болта 100 м, не сказав ему, что он должен бежать. – Mysticial
Строка 'x = 0;', вероятно, будет выполняться только один раз. Постоянное складывание - довольно простая оптимизация. Флаг '-O0' на самом деле не означает« * no * optimization »- на этапе предварительной обработки многое происходит. – usr2564301
@Mystical: это зависит ... Конечно, вы не должны сравнивать оптимизированный с не (или по-другому) оптимизированный код. Но тестирование с точно такими же оптимизациями * может быть полезно для тестирования самих алгоритмов, независимо от оптимизаций, связанных с компилятором. – usr2564301