首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按概率排序if...else if语句的效果是什么?

按概率排序if...else if语句的效果是什么?
EN

Stack Overflow用户
提问于 2017-10-19 15:17:13
回答 10查看 17.7K关注 0票数 197

具体来说,如果我有一系列的if.else if语句,并且我事先知道每个语句将计算到true的相对概率,那么按照概率排序它们的执行时间有多大的不同呢?例如,我是否更喜欢这样:

代码语言:javascript
复制
if (highly_likely)
  //do something
else if (somewhat_likely)
  //do something
else if (unlikely)
  //do something

为了这个?:

代码语言:javascript
复制
if (unlikely)
  //do something
else if (somewhat_likely)
  //do something
else if (highly_likely)
  //do something

很明显,排序的版本会更快,但是对于可读性或副作用的存在,我们可能需要非优化地排序它们。在实际运行代码之前,很难判断CPU在分支预测方面做得如何。

所以,在这个实验过程中,我最终回答了我自己对一个具体案例的问题,不过我也想听听其他的观点/见解。

重要:这个问题假设if语句可以被任意地重新排序,而不会对程序的行为产生任何其他影响。在我的回答中,这三个条件测试是相互排斥的,不会产生任何副作用。当然,如果必须按照一定的顺序对语句进行评估以实现某些期望的行为,那么效率问题就没有意义了。

EN

Stack Overflow用户

发布于 2017-10-19 20:11:01

根据这里的其他一些答案,看起来唯一真正的答案是:--它依赖于。这至少取决于以下几点(但不一定按这一重要顺序排列):

  • 各分支的相对概率。,这是最初提出的问题。根据现有的答案,似乎在某些条件下,按概率排序是有帮助的,但似乎并不总是这样。如果相对概率并没有很大的不同,那么就不太可能改变它们所处的顺序。然而,如果第一种情况发生的时间是99.999%,而下一种情况是剩下时间的一小部分,那么我将假设,将最有可能的条件放在第一位在时间上是有益的。
  • 计算每个分支的真/假条件的成本。如果测试条件的时间成本对于一个分支和另一个分支来说真的很高,那么这可能会对时间和效率产生重大影响。例如,假设一个条件需要一个时间单位来计算(例如,检查布尔变量的状态),而另一个条件则需要花费数十、数百、数千甚至数百万个时间单位来计算(例如,检查磁盘上的文件内容或对大型数据库执行复杂的SQL查询)。假设代码每次按照顺序检查条件,那么速度更快的条件应该是第一个(除非它们依赖于其他条件首先失败)。
  • Compiler/Interpreter --一些编译器(或解释器)可能包括一种可能影响性能的另一种类型的优化(其中有些只有在编译和/或执行过程中选择某些选项时才会出现)。因此,除非您使用完全相同的编译器在同一个系统上对两个编译和执行相同代码进行基准测试,其中唯一的区别是所讨论的分支的顺序,否则您将不得不为编译器的变体留出一些空间。
  • 操作系统/硬件正如luk32和Yakk所提到的,各种CPU都有自己的优化(操作系统也是如此)。因此,基准再一次容易受到变化的影响。
  • 代码块执行频率如果包含分支的块很少被访问(例如,在启动期间只访问一次),那么您放置分支的顺序可能无关紧要。另一方面,如果在代码的关键部分中,您的代码正在锤击这个代码块,那么排序可能非常重要(取决于基准测试)。

确定的唯一方法是对您的具体情况进行基准测试,最好是在与代码最终将在其上运行的预期系统相同(或非常类似)的系统上。如果它打算在一组具有不同硬件、操作系统等的不同系统上运行,那么最好在多个变体之间进行基准测试,看看哪一个是最好的。将代码编译为一种类型的系统上的一种排序和另一种类型的系统上的另一种排序甚至可能是一个好主意。

我个人的经验法则(在大多数情况下,在没有基准的情况下)是基于:

  1. 依赖于先前条件的结果的条件
  2. 计算条件的成本,然后
  3. 各分支的相对概率。
票数 20
EN
查看全部 10 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46833310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档