[c++] что быстрее считается
вообще, думается, первый должен быть быстрее - одно разыменовывание указателя вместо двух, сложений меньше
замерять - по времени работы например в цикле из миллиона итераций, выключив оптимизацию
Если выключить оптимизацию, то первый вариант может быть и медленнее, если значение y1 будет сохраняться в память (хотя вроде у MSVC нет привычки писать в память все подряд). Другое дело, что непонятен смысл бенчмарка без оптимизации. Я согласен, что цикл оптимизировать не хочется, но интересующая конструкция в рабочем коде-то будет соптимизирована, значит и в бенчмарке она нужна в таком же виде.
double * s_source;Компилишь эту штуку так: "cl.exe /Fa [/Dvar1] [/O2] myfile.c", получаешь рядом asm-исходник
int main
{
double *s;
int a = 0,b = 0;
double y1,y = 0;
s = s_source;
#ifdef var1
y1=*(s+a+b);
y+=y1*y1;
#else // var2
y+=*(s+a+b)**(s+a+b);
#endif
printf("%lf", y);
return 0;
}
без оптимизации:
; Line 9
mov eax, DWORD PTR _a$[ebp]
mov ecx, DWORD PTR _s$[ebp]
lea edx, DWORD PTR [ecx+eax*8]
mov eax, DWORD PTR _b$[ebp]
fld QWORD PTR [edx+eax*8]
fstp QWORD PTR _y1$[ebp]
; Line 10
fld QWORD PTR _y1$[ebp]
fmul QWORD PTR _y1$[ebp]
fadd QWORD PTR _y$[ebp]
fstp QWORD PTR _y$[ebp]
; Line 12с оптимизацией:
mov eax, DWORD PTR _a$[ebp]
mov ecx, DWORD PTR _s$[ebp]
lea edx, DWORD PTR [ecx+eax*8]
mov eax, DWORD PTR _a$[ebp]
mov ecx, DWORD PTR _s$[ebp]
lea eax, DWORD PTR [ecx+eax*8]
mov ecx, DWORD PTR _b$[ebp]
mov esi, DWORD PTR _b$[ebp]
fld QWORD PTR [edx+ecx*8]
fmul QWORD PTR [eax+esi*8]
fadd QWORD PTR _y$[ebp]
fstp QWORD PTR _y$[ebp]
; Line 9
fld QWORD PTR [eax]
; Line 10
fmul ST(0 ST(0)
; Line 12
fld QWORD PTR [eax]
fmul ST(0 ST(0)
Спасибо за исчерпывающие ответы. Тему можно закрывать.
Оставить комментарий
yur-kh
Есть такой кодdouble *s
int a,b
double y1,y
Вариант 1.
y1=*(s+a+b);
y+=y1*y1;
Вариант 2.
y+=*(s+a+b)**(s+a+b);
На выходе нужна y (y1 - временная перменная). Какой вариант с точки зрения скорости оптимальней?
И как правильно оценивать скорость выполнения таких кусков кода?
Доп. данные (не знаю, нужны или нет) - win32, vs2008.