我有一個哈希方法,其操作取決於函數的輸入。對程序進行剖析表明,花費太多時間來評估這種散列方法。我想嘗試將其更改爲表達式樹,因此內部循環檢查可以完成一次。希望它會更快,但我會以任何方式瞭解表達樹。如何將此代碼轉換爲表達式樹?
下面是函數的簡化版本(我解開了例如一些明顯的優化,並拿出任何輸入驗證):
Private Function Checksum(ByVal inputValues As IEnumerable(Of UInt32),
ByVal declarations As IEnumerable(Of String),
ByVal statements As IEnumerable(Of String)) As UInt32
Dim variables = New Dictionary(Of Char, UInt32)
For Each declaration In declarations
'parse declaration (eg. "X=52")'
variables(declaration(0)) = UInt32.Parse(declaration.Substring(2))
Next declaration
For Each value In inputValues
'"I"nput'
variables("I"c) = value
For Each statement In statements
'parse statement (eg. "X=Y+Z")'
Dim varResult = statement(0)
Dim valueLeft = variables(statement(2))
Dim operand = statement(3)
Dim valueRight = variables(statement(4))
'execute statement'
Dim valueResult As UInt32
Select Case operand
Case "+"c : valueResult = valueLeft + valueRight
Case "-"c : valueResult = valueLeft - valueRight
Case "*"c : valueResult = valueLeft * valueRight
Case "&"c : valueResult = valueLeft And valueRight
Case "|"c : valueResult = valueLeft Or valueRight
Case "^"c : valueResult = valueLeft Xor valueRight
End Select
variables(varResult) = valueResult
Next statement
Next value
'"O"utput'
Return variables("O"c)
End Function
我想創建一個函數,它接受了宣言和聲明,以及輸出一個專門的表達式樹,表示一個函數,它接受一個IEnumerable的UInt32並返回一個UInt32。
追問:
我成功,並且加速了荒謬(一個數量級)。我必須學習的主要內容在哪裏:
- 使用Expression.Lambda和Expression.Compile來獲取您實際可以使用的委託。
- Expression.Block工廠方法有一個'變量'參數,你(本質上)用來聲明局部變量。同樣,Expression.lambda具有「參數」。
- 如果您兩次調用Expression.Parameter,那麼您正在處理兩個不同的變量(即使它們的名稱相同)!存儲結果以備後用。標籤等相同
- BlockExpression的結果是塊中的最後一個表達式。
這似乎是一個非常複雜的方式來計算散列值。有這樣的理由嗎? – 2010-02-12 15:14:00
它是登錄到服務器時提供的校驗和的一部分。我無法控制要計算什麼,只有如何計算它。 – 2010-02-12 15:44:18