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

Are there any performance benefits in C# discards?

考虑这段代码:

var (mult, sum) = MultSum(a, b);

var (_, sum) = MultSum(a, b);

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

问题二 有没有什么办法可以让 MultSum 足够聪明,这样它就不会计算弃牌!?

If I use discard instead of a variable name, does it have performance benefit? eg. by reducing assignment operations.

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

现在,如果您有一个表达式丢弃了整个值,而不是元组的片段,那么编译器和抖动可以很聪明地不在短期池中为结果分配任何存储空间,或重新使用已分配的现有存储空间。请注意,我所说的 "short-term pool" 实际上是指 "activation record on the stack" 或 "registers"。从理论上讲,这可能会导致更好的寄存器分配或更小的帧(因此更好的参考位置)并且反过来可以为您节省整个 纳秒 .

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

您应该尝试通过使用弃牌获得的收益是 "make my program easier to understand" 收益。程序员很贵;优化使您的代码易于未来的程序员阅读、理解和修改。

Is there any way to write the MultSum smart enough so it doesn't calculate the discards!?

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