Есть ли разница в вычислительной стоимостили пустой «еще» стоимость в любое время
if(something){
return something;
}else{
return somethingElse;
}
и
if(something){
return something;
}
//else (put in comments for readibility purposes)
return somethingElse;
В теории мы имеем команду (еще), но это не кажется, это должно сделать разницу в действии.
Редактировать: После запуска кода для разных размеров набора, я обнаружил, что на самом деле существует различие, код без остатка примерно на 1,5% эффективнее. Но это, скорее всего, зависит от компилятора, о чем свидетельствуют многие люди ниже. Код я тестировал на:
int withoutElse(bool a){
if(a)
return 0;
return 1;
}
int withElse(bool a){
if(a)
return 0;
else
return 1;
}
int main(){
using namespace std;
bool a=true;
clock_t begin,end;
begin= clock();
for(__int64 i=0;i<1000000000;i++){
a=!a;
withElse(a);
}
end = clock();
cout<<end-begin<<endl;
begin= clock();
for(__int64 i=0;i<1000000000;i++){
a=!a;
withoutElse(a);
}
end = clock();
cout<<end-begin<<endl;
return 0;
}
Проверено на петлях от 1 000 000 до 1 000 000 000, и результаты были последовательно разные
Edit 2: код Ассамблеи (еще раз, генерируется с помощью Visual Studio 2010) также показывает небольшую разницу (appareantly, я не гожусь с сборщиков :()
[email protected]@[email protected] PROC ; withElse, COMDAT
; Line 12
push ebp
mov ebp, esp
sub esp, 192 ; 000000c0H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-192]
mov ecx, 48 ; 00000030H
mov eax, -858993460 ; ccccccccH
rep stosd
; Line 13
movzx eax, BYTE PTR _a$[ebp]
test eax, eax
je SHORT [email protected]
; Line 14
xor eax, eax
jmp SHORT [email protected]
; Line 15
jmp SHORT [email protected]
[email protected]:
; Line 16
mov eax, 1
[email protected]:
; Line 17
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
[email protected]@[email protected] ENDP ; withElse
и
[email protected]@[email protected] PROC ; withoutElse, COMDAT
; Line 4
push ebp
mov ebp, esp
sub esp, 192 ; 000000c0H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-192]
mov ecx, 48 ; 00000030H
mov eax, -858993460 ; ccccccccH
rep stosd
; Line 5
movzx eax, BYTE PTR _a$[ebp]
test eax, eax
je SHORT [email protected]
; Line 6
xor eax, eax
jmp SHORT [email protected]
[email protected]:
; Line 7
mov eax, 1
[email protected]:
; Line 9
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
[email protected]@[email protected] ENDP ; withoutElse
Преждевременная оптимизация - это корень всего зла. – devnull
Проверьте сгенерированный код ассемблера для обоих вариантов. Это единственный способ быть уверенным. –
не совсем вопрос теории сложности. – RichardPlunkett