如何从C#中的"纯函数"中获得优化?

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#语言的长期研究目标,以找出一些方法来利用语言,编译器和运行时中纯函数(以及不纯但"孤立"函数)的强大功能.但这样做涉及许多困难问题,在行业或学术界对最佳方法几乎没有共识的问题.顶尖思想家正在考虑这个问题,但不要指望任何重大成果.

  • +1,.Net 4.0中的代码合同也具有[Pure]属性. (2认同)

Rob*_*sor 8

如果计算成本很高,您可以将结果缓存在字典中吗?

    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功能可能会为你节省很多代码......