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

时间:2019-12-18 21:47:32

标签: c# c#-8.0

考虑以下代码:

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

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

问题1。 如果我使用丢弃而不是变量名,它是否具有性能优势?例如。通过减少分配操作。

问题2。 有什么方法可以使MultSum足够聪明,以至于它不计算丢弃次数!?

1 个答案:

答案 0 :(得分:10)

  

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

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

现在,如果您有一个包含全部值而不是元组片段的舍弃的表达式,那么编译器和抖动可能会很聪明,不会在短期池中为结果分配任何存储空间,或者重新分配-使用已经分配的现有存储。注意,“短期池”实际上是指“堆栈上的激活记录”或“寄存器”。从理论上讲,这可以导致更好的寄存器分配或更小的帧(从而更好的引用位置),进而可以节省整个 nanoseconds

纳米优化通常是不值得的;几乎总是存在一个更好的性价比问题需要解决。但是,如果您认为它可能与您的情况有关,请对其进行测量并查看。这是唯一方式来了解是否存在相关的性能差异。拿出纳米级秒表,以两种方式运行代码,然后看看哪一个更快。

您应该尝试通过使用抛弃产生的好处是“使我的程序更易于理解”的好处。程序员很昂贵;进行优化,以使您的代码易于将来的程序员阅读,理解和修改。

  

有什么方法可以使MultSum足够智能,以至于它不计算丢弃率!?

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