什么是pessimization?

20
在问题“使用C++11的auto能提高性能吗?”的评论中,有一条被投票数很高的评论建议使用auto“使无意中的不良反应变得不太可能”,作为答案。我以前从未注意到这个术语。我猜它在某种程度上与优化相反。
任何人能否给出更详细的定义?在编程的上下文中,这是什么意思?糟糕的代码会是什么样子?

出于猜测,我认为这不是一个技术术语。 - Marco A.
我想你可以构造一些例子,在使用auto之前,你可能会对返回类型做出不恰当的假设,导致过度昂贵且完全不必要的类型转换。那将是一种负优化。 - AndyG
相关帖子:https://dev59.com/AmUo5IYBdhLWcg3wpg0f - R Sahu
2
"优化"的反义词 - 使代码性能变差。 - Galik
1
哇,一个与代码无直接关系的问题,而且没有白日梦想家来解释网站规则并试图关闭它。太不可思议了。 - Puddle
3个回答

21

这主要是一个说法游戏,悲观主义者是乐观主义者的反义词。而悲观化是指编写不太优秀的代码。

编译器和程序员都可以通过使用糟糕的构造来将代码悲观化,例如在不需要时复制东西。 auto 关键字至少会确保您获得“最接近的类型”,因此不会进行(不必要的)类型转换。

请注意,当代码“不太优化”时,出于无益处的原因悲观化是错误的:

如果说“我们花了六个月来优化它,它会运行0.5%更快”,那么这不算是悲观化。除非强制要求提高0.5%的速度,否则在其上花费六个月可能是浪费时间。

此外,所需的功能(如安全性)不属于悲观化:“代码比可能能够实现的更慢,因为我们使其更加安全。”

调试版本不是“最劣”的,因为它具有用于捕获null指针引用以及检查数组访问索引等内容的断言。只要这些断言和检查是这样编写的,即在启用发布模式时会“消失”。[如果您的代码正在运行核电站,则可能永远不希望出现崩溃,请参见上面的“安全性”]

我曾经看到过一个旧的例子,其中包含以下C字符串循环:

char str [large_number] = "... several kilobytes of text (read from file) ... ";

for(char *p = str; p < str+strlen(str); p++)
{
   ... do stuff with p ... 
}

如果 do stuff with p 很复杂,编译器将无法意识到 strlen 是一个常量值,并且会在每次循环迭代中执行 strlen。 如果我们这样做,循环会运行快得多:

for(char *p = str, *e = str+strlen(str); p < e; p++)
{
   ... do stuff with p ... 
}

[不好意思,这并不是 auto 的示例]


3
大多数代码在某种标准下都不够优化。我认为关键是它比它本可以达到的更少优化,却没有任何益处。 - juanchopanza
@juanchopanza 没有一个词被认为是绝对的。优化的代码通常并不完全最优,它只是比非优化的代码更高效而已。 - Barmar
1
@juanchopanza:增加了更多措辞(牺牲了帖子的简洁性),并更详细地解释了区别[至少这是预期的效果]。 - Mats Petersson
1
@Barmar 同意。我并不是想暗示“最优”的定义是固定的。一般的想法是,你要做的是制作出一些东西,这些东西只会让事情变得更糟,对于“更糟”的合理定义(效率更低、更难读、更难测试、甚至更长时间打字...)。 - juanchopanza
当你说“次优代码”时,你是在使用委婉语吗?就像当有人让你尝尝他们的新食谱,但它味道像尿布桶底部发酵的湿垃圾一样,你可能会说它味道不太好?就像“你的代码很难阅读,并且需要比它应该的时间长上百倍;所以,它不太优秀。” - timeSmith

12

悲观优化并不只是提供效率不尽如人意的表现。

一般而言,它是在做某件事情,通常是为了提高性能,但实际上却降低了性能。虽然这并非绝对必要,但通常意味着结果实际上比你只做些简单明显的事情要糟糕得多。

在这种情况下,使用 auto 来指定变量类型是简单而明显的 - 无论它是否精确最佳,它都建立了基准性能水平。当您明确指定类型时,您基本上只有两个选择:明确定义与 auto 推导出的相同类型(获得完全相同的性能),或者指定其他类型(在这种情况下,实际上只有两种可能性:它根本无法工作,或者会进行某种转换,几乎肯定会降低性能)。

总结:悲观优化通常不仅仅是“获得次优的性能”,通常意味着“做额外的工作(可能是为了提高性能)实际上会降低性能。”


5
您可以在字典中查找,例如此页面所述:

pessimize(动词):

(及物)使某事物效率降低,例如计算机程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接