「他の言語」オプションに何かを追加するだけです。
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つの命令で実行しました。オプティマイザがなんらかの立派なものであれば、明らかにこれを心配する必要はありません。
答えが長すぎてすみません。