c# - 如何从 C# 中的 "pure function"获得优化?

标签 c# optimization functional-programming memoization

如果我有以下函数,它被认为是纯粹的,因为它没有副作用,并且在给定相同输入 x 的情况下总是会产生相同的结果。

public static int AddOne(int x) { return x + 1; }

据我了解,如果运行时了解功能纯度,它可以优化执行,这样就不必重新计算返回值。

有没有办法在 C# 中实现这种运行时优化?我假设这种优化有一个名称。它叫什么?

编辑:显然,我的示例函数不会从这种优化中获得太多好处。该示例是为了表达我心目中的纯度类型,而不是真实世界的示例。

最佳答案

正如其他人指出的那样,如果您想节省重新计算您已经计算过的结果的成本,那么您可以内存该函数。这会以增加内存使用量来提高速度——如果您怀疑如果缓存无限增长可能会耗尽内存,请记住偶尔清除缓存。

但是,除了内存它们的结果之外,还有其他可以对纯函数执行的优化。例如,没有副作用的纯函数通常可以安全地调用其他线程。使用大量纯函数的算法通常可以并行化以利用多核。

随着大规模多核机器变得越来越便宜和越来越普遍,这一领域将变得越来越重要。我们对 C# 语言有一个长期的研究目标,即找出某种方法来利用语言、编译器和运行时中纯函数(以及不纯但“孤立”的函数)的强大功能。但这样做涉及到许多难题,对于这些问题,工业界或学术界几乎没有就最佳方法达成共识。高层人士正在考虑这个问题,但不要指望很快会有任何重大成果。

关于c# - 如何从 C# 中的 "pure function"获得优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1363008/

相关文章:

c# - 如何从列表中删除字符串对象?

c# - 为什么 string[0] = "new value"不编译?

jquery - Twitter 需要 Bootstrap 轮播优化解决方案

c++ - 在 AVR 中逻辑右移 2 次方的速度更快吗?

functional-programming - 使用标准映射函数处理列表中的成对连续元素?

recursion - Ocaml:元组列表的递归

functional-programming - 什么是参照透明度?

c# - HttpContext.Current.User.Identity.Name 如何知道存在哪些用户名?

c# - 在反序列化 JSON 字符串期间处理 namespace 更改

perl - 我如何在执行的各个阶段进行 Perl CGI 性能测量、基准测试、时间测量?