如何在运行时优化lambda?

时间:2015-04-02 09:00:55

标签: c# lambda

我有一个测试工作来在运行时优化lambda-expression。假设lambda包含一些“重”函数调用,我需要更改lambda,以便所有函数调用都缓存到临时变量中,然后可以替换lambda体中的实际函数调用。

它必须是一个将lambda作为参数的函数,并返回优化的lambda,然后你可以调用它。

我想知道C#的哪一部分呢?我的意思是,像“了解反思”或“了解仿制药”。在这种情况下我需要学习什么?

2 个答案:

答案 0 :(得分:1)

除非您的重函数调用是deterministic,并且您可以证明它们始终使用相同的参数调用,否则您无法执行此操作。

例如,在C#

var lst = new List<string> { "Foo", "Bar" };

bool r1 = lst.Remove("Foo"); // true, and has modified lst
bool r2 = lst.Remove("Foo"); // false, and hasn't modified lst

bool r3 = lst.Remove("Bar"); // true, and has modified lst, note different parameter
bool r4 = lst.Remove("Baz"); // false, and hasn't modified lst, note different parameter

如何判断Remove是否具有确定性?你不能(技术上你可以拆卸它并检查它,但这是非常困难的)...然后你怎么能检测它是否被调用相同的参数?这是可行的,但非常困难。

现在......作为测试工作......我看到了三种可能性:

  • 这是一个错误的测试,您必须理解并报告
  • 你不理解测试工作
  • 你没有给我们一些重要的信息(例如你必须替换一些没有参数且是静态或类似的特定方法调用,并且保证是确定性的)

答案 1 :(得分:0)

我认为Memoization是您正在寻找的技术。

这篇文章解释了如何实现memoization in c# using generics and lambda expression

最后,您可以在ReactiveUI MemoizingMRUCache中找到该技术的实际实现。