【发布时间】:2012-03-29 17:35:45
【问题描述】:
我正在进行一个简短的思想实验,希望得到一些帮助。
考虑一个类,它根据一个函数计算一些输出,该函数本身可以改变,但只能根据预定的集合来改变。
或者,一些函数列表:
double function1(double input){
//perform some operations
return output;
}
double function2(double input){
//perform some operations
return output;
}
double function3(double input){
//perform some operations
return output;
}
double function4... etc.
现在假设这些函数包含在某个类中,该类预先确定了每当调用该类以计算某个值时使用哪个函数
Class Calculate{
int whichFunction = 2;
double calculate (double input){
//decide which function to use
switch(whichFunction){
case 1:
return function1(input);
break;
case 2:
return function2(input);
break;
case 3:
return function3(input);
break;
case 4... etc..
}
... predetermined functions here....
}
当然,执行此操作的第一个想法是打开值并继续前进。但是,如果我们不使用开关,而只是将函数更改为运行呢?
即
Class Calculate{
Func<double> whichFunction;
double calculate (double input){
return whichFunction.Invoke(input);
}
void setFunction(int functionNumber){
switch(whichFunction){
case 1:
whichFunction = function1;
case 2:
whichFunction = function2;
case 3:
whichFunction = function3;
case 4... etc..
}
... predetermined functions here....
}
考虑到您选择的函数很少更改,或者甚至可能只在构造函数中设置一次,这会避免切换实际上提供运行时速度优势,或者以这种方式调用函数的行为会抵消好处.
其他可能的选择:
- 级联 if-else.... 不,可能是最慢的方法。
- 不要使用 Func 泛型,而是使用委托。
- 利用事件并简单地重新分配分配给事件的功能。
- 不要使用 Func,而是使用方法指针。
任何想法都将不胜感激!
【问题讨论】:
-
如果您真的关心,请测量。并且一定要考虑 JIT 预热。更妙的是,算了吧 - 可能还有一百个低垂的果实。
-
你为什么要做一个思想实验来解决一个真实实验可以回答的问题?
标签: c# performance delegates function-pointers