2010-02-12 79 views
1

我有一個哈希方法,其操作取決於函數的輸入。對程序進行剖析表明,花費太多時間來評估這種散列方法。我想嘗試將其更改爲表達式樹,因此內部循環檢查可以完成一次。希望它會更快,但我會以任何方式瞭解表達樹。如何將此代碼轉換爲表達式樹?

下面是函數的簡化版本(我解開了例如一些明顯的優化,並拿出任何輸入驗證):

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 

我想創建一個函數,它接受了宣言和聲明,以及輸出一個專門的表達式樹,表示一個函數,它接受一個I​​Enumerable的UInt32並返回一個UInt32。


追問:

我成功,並且加速了荒謬(一個數量級)。我必須學習的主要內容在哪裏:

  • 使用Expression.Lambda和Expression.Compile來獲取您實際可以使用的委託。
  • Expression.Block工廠方法有一個'變量'參數,你(本質上)用來聲明局部變量。同樣,Expression.lambda具有「參數」。
  • 如果您兩次調用Expression.Parameter,那麼您正在處理兩個不同的變量(即使它們的名稱相同)!存儲結果以備後用。標籤等相同
  • BlockExpression的結果是塊中的最後一個表達式。
+1

這似乎是一個非常複雜的方式來計算散列值。有這樣的理由嗎? – 2010-02-12 15:14:00

+0

它是登錄到服務器時提供的校驗和的一部分。我無法控制要計算什麼,只有如何計算它。 – 2010-02-12 15:44:18

回答

2

VS 2010 RC有一個文檔更新。我在這裏添加了一些新的ET API示例:http://msdn.microsoft.com/en-us/library/bb397951(VS.100).aspx 它顯示瞭如何創建局部變量以及如何執行表達式樹。例子都在VB和C#中。

但說實話,我還是不明白你在做什麼。爲什麼你的聲明和陳述以字符串形式出現?而這個OpToExp函數對我來說也是一個謎。你是如何設法將操作數作爲表達式的,但是操作符(出於某種原因稱爲「操作數」)是char? 如果您提供了有關您正在嘗試執行的操作以及系統的整體設計的更多信息,我可能會幫助您更好。

+0

我同意你的意見,該功能設計得很差。但這是服務器使用的散列。我需要實現它才能登錄,而且我無法更改它。 操作數/操作符是一個愚蠢的錯誤,oops。 *操作數*是表達式,因爲它們在被傳遞給函數之前被解析,而操作符不是。 – 2010-02-12 19:49:37

+0

這正是我所需要的。 – 2010-02-12 20:02:51