動態編譯我的我怎麼能改善動態代碼生成性能的想法,但我不知道這是解決這個問題的最好辦法。性能
假設我有一類
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