如何在运行时优化 lambda?
How to optimize lambda at runtime?
我有一个在运行时优化 lambda 表达式的测试作业。假设 lambda 包含一些 "heavy" 函数调用,我需要的是更改 lambda,以便将所有函数调用缓存到临时变量中,然后可以替换 lambda 主体中的实际函数调用。
它必须是一个以 lambda 作为参数的函数,并且 returns 优化的 lambda 可以调用。
我想知道这是 C# 的哪一部分?我的意思是,比如 "learn about reflections" 或 "learn about generics"。在这种情况下我需要学习什么?
除非你的重函数调用是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
是否具有确定性?你不能(从技术上讲你可以拆解它并检查它,但这非常困难)......然后你怎么能检测它是否正在使用相同的参数调用?这是可行的,但相当困难。
现在...作为测试工作...我看到三种可能性:
- 这是一个假测试,你必须理解并报告它
- 你没看懂测试作业
- 你没有给我们一些重要的信息(例如,你必须替换一些没有参数并且是静态的或类似的,并且保证是确定性的特定方法调用)
我认为 Memoization 是您正在寻找的技术。
这里有一篇文章解释了如何实现 memoization in c# using generics and lambda expression。
最后,您可以在 ReactiveUI MemoizingMRUCache 中找到该技术的实际实现。
我有一个在运行时优化 lambda 表达式的测试作业。假设 lambda 包含一些 "heavy" 函数调用,我需要的是更改 lambda,以便将所有函数调用缓存到临时变量中,然后可以替换 lambda 主体中的实际函数调用。
它必须是一个以 lambda 作为参数的函数,并且 returns 优化的 lambda 可以调用。
我想知道这是 C# 的哪一部分?我的意思是,比如 "learn about reflections" 或 "learn about generics"。在这种情况下我需要学习什么?
除非你的重函数调用是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
是否具有确定性?你不能(从技术上讲你可以拆解它并检查它,但这非常困难)......然后你怎么能检测它是否正在使用相同的参数调用?这是可行的,但相当困难。
现在...作为测试工作...我看到三种可能性:
- 这是一个假测试,你必须理解并报告它
- 你没看懂测试作业
- 你没有给我们一些重要的信息(例如,你必须替换一些没有参数并且是静态的或类似的,并且保证是确定性的特定方法调用)
我认为 Memoization 是您正在寻找的技术。
这里有一篇文章解释了如何实现 memoization in c# using generics and lambda expression。
最后,您可以在 ReactiveUI MemoizingMRUCache 中找到该技术的实际实现。