"다른 언어"옵션에 대한 내용을 추가합니다.
C : 이건 정말 큰 차이가없는 학문적 운동이기 때문에 뭔가 다른 것에 기여할 것이라고 생각했습니다.
최적화없이 어셈블리로 컴파일하고 결과를 확인했습니다.
코드:
int main() {
volatile int a;
volatile int b;
asm("## 5/2\n");
a = 5;
a = a / 2;
asm("## 5*0.5");
b = 5;
b = b * 0.5;
asm("## done");
return a + b;
}
컴파일 gcc tdiv.c -O1 -o tdiv.s -S
2로 나누기 :
movl $5, -4(%ebp)
movl -4(%ebp), %eax
movl %eax, %edx
shrl $31, %edx
addl %edx, %eax
sarl %eax
movl %eax, -4(%ebp)
0.5 곱하기 :
movl $5, -8(%ebp)
movl -8(%ebp), %eax
pushl %eax
fildl (%esp)
leal 4(%esp), %esp
fmuls LC0
fnstcw -10(%ebp)
movzwl -10(%ebp), %eax
orw $3072, %ax
movw %ax, -12(%ebp)
fldcw -12(%ebp)
fistpl -16(%ebp)
fldcw -10(%ebp)
movl -16(%ebp), %eax
movl %eax, -8(%ebp)
그러나 그 int
s를 double
s로 변경했을 때 (파이썬이 아마도 할 것입니다), 나는 이것을 얻었습니다.
분할:
flds LC0
fstl -8(%ebp)
fldl -8(%ebp)
flds LC1
fmul %st, %st(1)
fxch %st(1)
fstpl -8(%ebp)
fxch %st(1)
곱셈:
fstpl -16(%ebp)
fldl -16(%ebp)
fmulp %st, %st(1)
fstpl -16(%ebp)
이 코드를 벤치마킹하지는 않았지만 코드를 살펴보면 정수를 사용하는 것만으로도 2로 나누는 것이 2로 나누는 것보다 짧다는 것을 알 수 있습니다. double을 사용하면 컴파일러가 프로세서의 부동 소수점 연산 코드를 사용하기 때문에 곱셈이 더 짧습니다. 동일한 작업에 사용하지 않는 것보다 더 빨리 실행될 수 있습니다 (실제로는 모르겠습니다). 따라서 궁극적으로이 답변은 0.5 곱셈의 성능과 2로 나누기의 성능은 언어의 구현과 실행되는 플랫폼에 달려 있음을 보여줍니다. 궁극적으로 그 차이는 무시할 만하 며 가독성 측면을 제외하고는 거의 걱정할 필요가 없습니다.
참고로 내 프로그램 main()
에서 a + b
. volatile 키워드를 제거하면 어셈블리가 어떻게 생겼는지 추측하지 못할 것입니다 (프로그램 설정 제외).
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
하나의 명령어로 나누기, 곱하기, 더하기를 모두 수행했습니다! 옵티마이 저가 어떤 종류의 존경받을 만하다면 이것에 대해 걱정할 필요가 없습니다.
답변이 너무 길어서 죄송합니다.