C # : Randall Cook의 답변 에 대한 변형은 확장 방법보다 코드의 수학적 "모양"을 유지하기 때문에 래퍼를 사용하는 대신 랩을 사용하는 대신 함수 참조를 사용하는 것입니다. 개인적으로 코드가 더 깨끗해 보이지만 기본적으로 같은 일을하고 있습니다.
랜달의 랩핑 된 함수, 함수 참조 및 직접 호출을 포함한 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