C# 丢弃有任何性能优势吗?

meh*_*dvd 5 c# c#-8.0

考虑这个代码:

var (mult, sum) = MultSum(a, b);
Run Code Online (Sandbox Code Playgroud)

var (_, sum) = MultSum(a, b);
Run Code Online (Sandbox Code Playgroud)

问题1. 如果我使用discard 代替变量名,它是否有性能优势?例如。通过减少赋值操作。

问题 2. 有没有什么办法可以写出MultSum足够聪明的东西,这样它就不会计算弃牌了!?

Eri*_*ert 15

如果我使用丢弃而不是变量名,它是否有性能优势?例如。通过减少赋值操作。

在您的特定情况下,性能不太可能带来好处。返回的元组被分配到临时存储;您只是没有为该存储的一部分命名。

现在,如果您有一个表达式的丢弃是整个值,而不是元组的片段,那么编译器和抖动可以很聪明地不在短期池上为结果分配任何存储,或者重新使用现有的已经分配的存储。请注意,“短期池”实际上是指“堆栈上的激活记录”或“寄存器”。从理论上讲,这可以导致更好的寄存器分配或更小的帧(因此更好的参考位置),从而可以为您节省整个纳秒

纳米优化通常不值得;几乎总是有一个更好的“物超所值”的性能问题可以解决。但是,如果您认为它可能与您的场景相关,请对其进行测量并查看。这是了解是否存在相关性能差异的唯一方法。拿出一个纳米级的秒表,双向运行代码,看看哪个更快。

您应该尝试通过使用丢弃来获得的好处是“使我的程序更易于理解”的好处。程序员很贵;优化使您的代码易于未来的程序员阅读、理解和修改。

有什么方法可以编写足够聪明的 MultSum 以便它不计算丢弃!?

是的。用 Haskell 编写你的程序。 Haskell 将避免执行从不使用结果的计算。C# 不是这样的语言。