C#/。NET(さらにはJava)での行列の乗算が非常に遅くなる理由がよくわかりません。
このベンチマークを見てください(ソース):更新されたベンチマークを見つけようとしています。
C#の整数および倍精度のパフォーマンスは、MSVC++でコンパイルされたC++に非常に近いものです。ダブルの場合は87%、32ビット整数の場合は99%高速です。かなり良いと思います。しかし、次に行列の乗算を見てください。ギャップはC#に広がり、約19%速くなります。これは私には理解できないかなり大きな矛盾です。行列の乗算は、単純な数学の集まりにすぎません。どうしてこんなに遅くなっているの?同等の数の単純な浮動小数点または整数演算とほぼ同じくらい高速であるべきではありませんか?
これは、ゲームやXNAで特に懸念されます。この場合、物理エンジンなどで行列とベクトルのパフォーマンスが重要になります。少し前に、Monoはいくつかの気の利いたベクトルと行列クラスを介してSIMD命令のサポートを追加しました。SIMDを使用したC++ほど高速ではありませんが、ギャップを埋め、Monoを手書きのC++よりも高速にします。(ソース)
何が起きてる?
編集:よく見ると、2番目のグラフを読み間違えました。C#はかなり近いように見えます。最初のベンチマークは、ひどく間違ったことをしているだけですか?申し訳ありませんが、最初のベンチマークのバージョン番号を見逃しました。いつも聞いている「C#線形代数は遅い」の参考資料として手に取った。私は別のものを見つけようとします。