Lar*_*nal 14 c# optimization functional-programming memoization
如果我有以下函数,它被认为是纯粹的,因为它没有副作用,并且在给定相同输入x的情况下总是会产生相同的结果.
public static int AddOne(int x) { return x + 1; }
Run Code Online (Sandbox Code Playgroud)
据我了解,如果运行时理解功能纯度,它可以优化执行,以便不必重新计算返回值.
有没有办法在C#中实现这种运行时优化?我假设这种优化有一个名称.它叫什么?
编辑:显然,我的示例函数不会从这种优化中获得很多好处.这个例子用来表达我心中的纯洁类型而不是现实世界的例子.
Eri*_*ert 25
正如其他人所指出的,如果你想节省重新计算你已经计算过的结果的成本,那么你可以记住这个功能.这会增加内存使用量以提高速度 - 如果您怀疑如果缓存无限制地增长,则可能会偶尔清除缓存.
但是,除了记忆结果之外,还可以对纯函数执行其他优化.例如,没有副作用的纯函数通常可以安全地调用其他线程.使用大量纯函数的算法通常可以并行化以利用多个核.
随着大型多核机器变得更便宜和更常见,该领域将变得越来越重要.我们有一个C#语言的长期研究目标,以找出一些方法来利用语言,编译器和运行时中纯函数(以及不纯但"孤立"函数)的强大功能.但这样做涉及许多困难问题,在行业或学术界对最佳方法几乎没有共识的问题.顶尖思想家正在考虑这个问题,但不要指望任何重大成果.
如果计算成本很高,您可以将结果缓存在字典中吗?
static Dictionary<int, int> cache = new Dictionary<int, int>();
public static int AddOne(int x)
{
int result;
if(!cache.TryGetValue(x, out result))
{
result = x + 1;
cache[x] = result;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下字典查找比添加更昂贵:)
Wes Dyer在这里解释了另一个更酷的方法来进行功能性记忆:http://blogs.msdn.com/wesdyer/archive/2007/01/26/function-memoization.aspx - 如果你做了很多这样的缓存,那么他的Memoize功能可能会为你节省很多代码......