C#+WPFチューニング戦記

C#とWPFで高速なコードと最適なシステムを書くためにやってきたいろいろな事を書いてみます。.NET Frameworkのソースコードを読み解きましょう。なお、ここに書かれているのは個人の見解であって何らかの団体や企業の見解を代表するものではありません。

C#7.3 in this ValueTuple が速い

C#7.3でこんなベンチマークをしました。 in this ValueTuple の組み合わせが出来ると本当に高速です。

[Benchmark]
public void DoubleMaxLegacy()
{
    for(int idx=0 ; idx<10000;idx++)
        result[idx] = Math.Max((double)(10000 - idx), (double)idx);
}

[Benchmark]
public void DoubleMaxNew()
{
    for(int idx=0 ; idx<10000;idx++)
        result[idx] = ((double)(10000 - idx), (double)idx).Max();
}

// 新しいMaxはこちら。演算内容はMath.Max()と全く同じです。
public static double Max(in this ValueTuple<double, double> value)
{
    return value.Item1 > value.Item2 || double.IsNaN(value.Item1) ? value.Item1 : value.Item2;
}

こちらが結果です。Meanを見ると分かりますが、2倍近く高速です。侮れません。

         Method |        Mean |      Error |     StdDev |
DoubleMaxLegacy | 28,950.1 ns | 158.509 ns | 148.269 ns |
   DoubleMaxNew | 15,761.9 ns | 113.574 ns | 106.237 ns |

暗黙のキャストができない以外は極めて優秀です。 ベンチマークは BenchmarkDotNet を使っています。

#this は速度に関係あるのかって?多分ないです。こう書きたかったから。