我有一个散列方法,其操作取决于函数的输入。对程序进行分析表明,花费了太多时间来评估这种哈希方法。我想尝试将其更改为表达式树,因此内部循环检查可以完成一次。希望它会更快,但无论如何我都会学习表达树。
这是函数的简化版本(我为示例解除了一些明显的优化,并取消了任何输入验证):
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。
后续:
我成功了,加速荒谬(一个数量级)。我必须学习的主要内容:
答案 0 :(得分:2)
VS 2010 RC有一个文档更新。我在这里添加了一些关于新ET API的示例:http://msdn.microsoft.com/en-us/library/bb397951(VS.100).aspx 它显示了如何创建局部变量以及如何执行表达式树。示例包括VB和C#。
但老实说,我仍然不明白你想做什么。为什么声明和语句以字符串形式出现?而这个OpToExp功能对我来说也是一个谜。你是如何设法将操作数作为表达式,但操作符(由于某种原因你称之为“操作数”)作为char? 如果您提供有关您要执行的操作以及系统整体设计的更多信息,我可能会帮助您更好。