【问题标题】:What is pessimization?什么是悲观?
【发布时间】:2015-09-16 21:14:20
【问题描述】:

Can the use of C++11's auto improve performance? 问题上有一条评论获得了很多票,并建议“使其不太可能无意中悲观”作为答案。我以前从未注意到这个词。我想这在某种程度上与优化相反。

谁能给出更详细的定义? 它在编程环境中意味着什么?悲观的代码会是什么样子?

【问题讨论】:

  • 出于猜测,我认为这不是一个技术术语..
  • 我想您可以设计一些示例,在 auto 之前,您可能会对返回类型做出不正确的假设,从而导致过于昂贵且完全不必要的类型转换。那将是一种悲观。
  • 与“优化*”相反 - 降低代码的性能。
  • 哇,一个和代码没有直接关系的问题,没有白夜来解释网站的规则并尝试关闭它。不可思议。

标签: c++ optimization language-agnostic


【解决方案1】:

这主要是文字游戏,悲观主义者与乐观主义者相反。悲观主义写的代码不是最优的。

编译器和程序员都可以通过错误的结构来悲观代码,例如在不需要时复制内容。 auto 关键字至少会确保您获得“最接近的类型”,因此没有(不必要的)类型转换。

请注意,悲观是指代码“非最优”没有任何好处:

这不是悲观“如果我们花六个月的时间优化它,它的运行速度会快 0.5%”。除非要求快 0.5%,否则花 6 个月时间可能是浪费时间。

此外,所需的功能,例如安全性,并不是悲观的:“代码比它可能的慢,因为我们使它安全”。

调试构建是最“悲观”的,因为它有断言来捕获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的例子]

【讨论】:

  • 按照某些标准,大多数代码都不是最优的。我认为关键是它没有达到最佳效果,没有任何收益。
  • @juanchopanza 这两个词都不是绝对的。优化后的代码通常不是完美的,只是应该比未优化的更高效。
  • @juanchopanza:添加了更多的措辞(对帖子的简洁性感到悲观)并更详细地解释了区别[至少这是预期的效果]
  • @Barmar 同意。我并不是要暗示“最佳”有一个硬性定义。一般的想法是,你做的事情只会让事情变得更糟,因为更糟糕的合理定义(效率更低、更难阅读、更难测试、甚至更长的打字......)
【解决方案2】:

悲观意味着不仅仅是提供不是最好的性能。

一般来说,它所做的事情通常是为了提高性能,但实际上会损害性能。虽然不是绝对需要,但通常意味着结果实际上比你只做一些简单而明显的事情更糟糕。

在这种情况下,使用auto 来指定变量的类型既简单又明显——无论它是否精确地优化,它都建立了性能的基线水平。当/如果您明确指定类型时,您基本上只会有两种选择:明确定义 auto 会推断出的相同类型(获得完全相同的性能),或指定其他类型(在这种情况下,实际上只有两种可能性:它根本不起作用,或者它会进行某种几乎不可避免地会损害性能的转换)。

总结:悲观化通常不仅仅是“获得更少的最佳性能”。通常是“做额外的工作(可能是为了提高性能)实际上会损害性能。”

【讨论】:

    【解决方案3】:

    您可以直接在字典中查找它,例如 this page,它说:

    悲观(动词):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多