「他の言語」オプションに何かを追加するだけです。
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 に変更すると (これはおそらく python が行うことです)、次のようになりました。
分割:
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 で乗算するよりも短いことがわかります。おそらく、同じ操作にそれらを使用しないよりも高速に実行されます (ただし、実際にはわかりません)。したがって、最終的にこの回答は、0.5 による乗算と 2 による除算のパフォーマンスは、言語の実装とそれが実行されるプラットフォームに依存することを示しています。最終的に、違いは無視できるほどのものであり、読みやすさを除いて、ほとんど気にする必要はありません。
main()
補足として、私のプログラムでは が返されることがわかりますa + b
。volatile キーワードを取り除くと、アセンブリがどのように見えるかを推測することはできなくなります (プログラムのセットアップを除く)。
## 5/2
## 5*0.5
## done
movl $5, %eax
leave
ret
除算、乗算、および加算の両方を 1 つの命令で実行しました。明らかに、オプティマイザーがなんらかの立派なものであれば、これについて心配する必要はありません。
長すぎる回答で申し訳ありません。