动态编译我的我怎么能改善动态代码生成性能的想法,但我不知道这是解决这个问题的最好办法。性能
假设我有一类
class Calculator
{
int Value1;
int Value2;
//..........
int ValueN;
void DoCalc()
{
if (Value1 > 0)
{
DoValue1RelatedStuff();
}
if (Value2 > 0)
{
DoValue2RelatedStuff();
}
//....
//....
//....
if (ValueN > 0)
{
DoValueNRelatedStuff();
}
}
}
的DoCalc方法是在最低水平,并在计算过程中多次调用。另一个重要方面是ValueN只在开始时设置,在计算过程中不会更改。许多DoCalc方法中的if都是不必要的,因为许多ValueN都是0.所以我希望动态代码生成可以帮助提高性能。
举例来说,如果我创建了一个方法
void DoCalc_Specific()
{
const Value1 = 0;
const Value2 = 0;
const ValueN = 1;
if (Value1 > 0)
{
DoValue1RelatedStuff();
}
if (Value2 > 0)
{
DoValue2RelatedStuff();
}
....
....
....
if (ValueN > 0)
{
DoValueNRelatedStuff();
}
}
与优化编译它打开了C#编译器是足够聪明,只保留必要的东西。所以我想在运行时根据ValueN的值创建这样的方法,并在计算过程中使用生成的方法。
我想,我可以用表达式树为,但表达式树只适用于简单的lambda函数,所以我不能用的东西一样,如果,而等功能体内。所以在这种情况下,我需要以适当的方式改变这个方法。
另一种可能性是创建必需的代码作为字符串和动态编译。但如果我能够采用现有的方法并相应地修改它,对我来说会更好。
还有Reflection.Emit的,但我不希望坚持使用它,因为它是非常难以维持。
顺便说一句。我不限于C#。所以我愿意接受最适合这类问题的编程语言的建议。除了LISP有几个原因。
一个重要的说明。 DoValue1RelatedStuff()不是我算法中的方法调用。这只是一些基于公式的计算,而且速度非常快。我应该写像这样
if (Value1 > 0)
{
// Do Value1 Related Stuff
}
我已经运行一些性能测试,我可以看到,有两个IFS当一个被禁用的优化方法比用多余的,如果快约2倍。
下面是我用于测试的代码:
public class Program
{
static void Main(string[] args)
{
int x = 0, y = 2;
var if_st = DateTime.Now.Ticks;
for (var i = 0; i < 10000000; i++)
{
WithIf(x, y);
}
var if_et = DateTime.Now.Ticks - if_st;
Console.WriteLine(if_et.ToString());
var noif_st = DateTime.Now.Ticks;
for (var i = 0; i < 10000000; i++)
{
Without(x, y);
}
var noif_et = DateTime.Now.Ticks - noif_st;
Console.WriteLine(noif_et.ToString());
Console.ReadLine();
}
static double WithIf(int x, int y)
{
var result = 0.0;
for (var i = 0; i < 100; i++)
{
if (x > 0)
{
result += x * 0.01;
}
if (y > 0)
{
result += y * 0.01;
}
}
return result;
}
static double Without(int x, int y)
{
var result = 0.0;
for (var i = 0; i < 100; i++)
{
result += y * 0.01;
}
return result;
}
}
如果您想使用'System.Linq.Expressions',则可以始终有条件地构建表达式树。它看起来可能与您最初编写的内容不完全相同,但几乎肯定会起作用,并且几乎肯定比“System.Reflection.Emit”更易于维护,并且它的表现也会更好。 – 2009-08-31 22:50:30
表达式树解决方案似乎是最有前途的。但总的来说,我想有一种工具能够以这种方式优化任何方法。 – Max 2009-08-31 23:10:47