考虑以下代码:
var (mult, sum) = MultSum(a, b);
和
var (_, sum) = MultSum(a, b);
问题1。 如果我使用丢弃而不是变量名,它是否具有性能优势?例如。通过减少分配操作。
问题2。
有什么方法可以使MultSum
足够聪明,以至于它不计算丢弃次数!?
答案 0 :(得分:10)
如果我使用丢弃而不是变量名,它是否具有性能优势?例如。通过减少分配操作。
在您的特定情况下,性能不太可能受益。返回的元组被分配给临时存储;您只是没有为该存储的一部分命名。
现在,如果您有一个包含全部值而不是元组片段的舍弃的表达式,那么编译器和抖动可能会很聪明,不会在短期池中为结果分配任何存储空间,或者重新分配-使用已经分配的现有存储。注意,“短期池”实际上是指“堆栈上的激活记录”或“寄存器”。从理论上讲,这可以导致更好的寄存器分配或更小的帧(从而更好的引用位置),进而可以节省整个 nanoseconds 。
纳米优化通常是不值得的;几乎总是存在一个更好的性价比问题需要解决。但是,如果您认为它可能与您的情况有关,请对其进行测量并查看。这是唯一方式来了解是否存在相关的性能差异。拿出纳米级秒表,以两种方式运行代码,然后看看哪一个更快。
您应该尝试通过使用抛弃产生的好处是“使我的程序更易于理解”的好处。程序员很昂贵;进行优化,以使您的代码易于将来的程序员阅读,理解和修改。
有什么方法可以使MultSum足够智能,以至于它不计算丢弃率!?
是的。 在Haskell中编写程序。 Haskell将避免执行从未使用过结果的计算。 C#不是这种语言。