C#:Randall Cookの回答のバリエーションは、拡張メソッドよりもコードの数学的な「外観」を維持するため、私は気に入っています。ラッパーを使用しますが、呼び出しではラップではなく関数参照を使用します 個人的にはコードがきれいに見えると思いますが、基本的には同じことをしています。
私は、Randallのラップされた関数、私の関数参照、直接呼び出しを含む小さなLINQPadテストプログラムをノックアップしました。
関数が参照する呼び出しは、基本的に直接呼び出しと同じ時間がかかります。ラップされた関数は一貫して遅くなります-大量ではありませんが。
コードは次のとおりです。
void Main()
{
MyMathyClass mmc = new MyMathyClass();
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
for(int i = 0; i < 50000000; i++)
mmc.DoStuff(1, 2, 3);
"Function reference:".Dump();
sw.Elapsed.Dump();
sw.Restart();
for(int i = 0; i < 50000000; i++)
mmc.DoStuffWrapped(1, 2, 3);
"Wrapped function:".Dump();
sw.Elapsed.Dump();
sw.Restart();
"Direct call:".Dump();
for(int i = 0; i < 50000000; i++)
mmc.DoStuffControl(1, 2, 3);
sw.Elapsed.Dump();
}
public class MyMathyClass
{
// References
public Func<double, double> sin;
public Func<double, double> cos;
public Func<double, double> tan;
// ...
public MyMathyClass()
{
sin = System.Math.Sin;
cos = System.Math.Cos;
tan = System.Math.Tan;
// ...
}
// Wrapped functions
public double wsin(double x) { return Math.Sin(x); }
public double wcos(double x) { return Math.Cos(x); }
public double wtan(double x) { return Math.Tan(x); }
// Calculation functions
public double DoStuff(double x, double y, double z)
{
return sin(x) + cos(y) + tan(z);
}
public double DoStuffWrapped(double x, double y, double z)
{
return wsin(x) + wcos(y) + wtan(z);
}
public double DoStuffControl(double x, double y, double z)
{
return Math.Sin(x) + Math.Cos(y) + Math.Tan(z);
}
}
結果:
Function reference:
00:00:06.5952113
Wrapped function:
00:00:07.2570828
Direct call:
00:00:06.6396096