【问题标题】:Performance: if else vs switch, while vs for, for each vs for, print vs printf [closed]性能:if else vs switch,while vs for,for each vs for,print vs printf [关闭]
【发布时间】:2023-03-17 04:15:01
【问题描述】:

我正在使用getrusage() 测试所有这些不同的构造,以计算(ru_utime + ru_stime) 在执行它们之前和之后的变化。
事实证明,对于类似的构造执行相同的任务并没有什么不同。以下是结果:
printf (1.5 ± 0.5)% 比 print
foreach (6.0 ± 1.0)% 比 for 循环快(迭代 1kk 个元素的索引数组)
for (9.0 ± 1.0)% 比 while 循环快
if/else (8.0 ± 1.0)% 比 switch 快(测试了两种情况、6 种情况和 10 种可能例)。

所以我想知道,这些差异真的很重要吗?如果我们在代码中使用所有最有效的此类结构,会有所不同吗?可能有 6%、8%、9% 或 10%,加起来会改变我们代码的效率吗?
或者这些差异仍然不明显,我的意思是服务器对请求的响应几乎不会变化?另外,如果我们使用if/else 而不是switchfor 而不是whileprintf 而不是printforeach 而不是for,它会占用更多内存吗?

【问题讨论】:

  • 是的,请使用概要分析器。然后查看 SQL 查询。
  • 您使用适当的结构来实现可读性,当差异以纳秒为单位时,不一定是最快的
  • 而且性能通常会根据您需要在循环中执行的操作而有所不同:例如如果您需要访问数组的关联键,那么使用 for() 几乎没有意义
  • 如果你想让某些东西运行得很快,你首先应该优化的是 PHP 本身。

标签: php performance loops conditional-statements


【解决方案1】:

就性能而言,使用StackOverflow 答案回答您的问题:

对于 if/elseswitch:性能相同 (more)。

对于for vs foreach vs while:没关系(more)。

对于printfprint:一个不比另一个好(more)。

我的拙见是,您使用对您来说更舒适和/或更好地满足您的需求的任何东西(彼此之间存在细微差异,在性能以外的其他方面,这取决于您的需求)。在性能方面,为了最大限度地提高性能,您应该注意其他事项,例如降低程序中使用的代码的O 复杂性、网络延迟处理、需要时的任务并行化等。您的问题是有点笼统,所以我试着用同样的方式回答。

【讨论】:

  • 您使用的答案主要基于直觉,而我自己进行了测试。无论如何,我的问题不在于哪个性能更高,而在于这些操作的性能。这些操作真的会影响服务器响应吗,还是它们差别不大
  • 您的系统在其他方面是否完美,例如算法复杂度等?我认为差异非常小,除非您使用的系统迫切需要在该级别进行优化.....
【解决方案2】:
  1. 你是对的。百分之几并不重要。
  2. 操作的可伸缩性对应用程序性能的影响远大于这几个百分比。从这个意义上说,可扩展性意味着如果您收到 2 倍或 10 倍的数据量,您的系统将如何运行。您的系统是否会仅减慢 2 倍、10 倍(如果它是线性的)或 4 倍、100 倍(二次)等。http://en.wikipedia.org/wiki/Scalability
  3. 此问题通常发生在其他提到的数据库端。有“大”的操作。有些数据可能很大。
  4. 大多数开发人员不必太在意资源。是的。分析是处理性能问题的正确方法。

【讨论】:

  • 但是假设一个循环执行了 1000 万次,假设是 for 循环需要 8 秒,但如果是 while,总共需要 9 秒。然后再假设同时一个条件被执行了1000万次,一个if else需要10秒,而一个switch需要11秒。还有一个 foreach 也需要 8 秒,而 a 需要 8.5 秒。所以事实证明,经过 1000 万次运行后,有 2.5 秒的差异。这不是很大吗?您可能会说 1000 万是一个很大的数字,但我们在编程中不是以大数字来衡量这些操作吗?数百万、数十亿等
  • 循环内部的任何内容都比循环结构本身重要得多。如果您在一个循环中运行 1000 万次计算,那么最好用另一种语言来运行这些计算。
  • 实际上,如果您看到 1000 万这个数字,它可能意味着两件事。 1. 这些数据量来自某个地方。在某处访问它将成为瓶颈(IO vs CPU)。 2. 一些东西已经被错误地缩放了,尝试修复缩放问题,这可以将1000万转换为10000,而不是浪费时间在百分之几上效率更高。
  • 我并不是说单次执行需要 1000 万次,假设已经有数千次请求,并且总共在 1 小时内执行了这个迭代次数
  • 我确信我们可以找到/创建几个百分比很重要的场景,但实际上这种情况非常罕见。至少根据我的经验。
【解决方案3】:

OP 写道:

这些差异真的很重要吗?如果我们在代码中使用所有最有效的此类结构,会有所不同吗?

嗯,是的,也不是。您正在编写超低延迟应用程序吗?硬(确定性)实时应用程序?如果是,那么是的。等待用户的键盘输入?你的 CPU 不会因为无聊而死,这是一个奇迹。所以,没有。

9% 的差异可能微不足道(你的精灵领主不会杀死巨魔),也可能非常显着(你祖母的生命维持系统会杀死她)。

基本上,这不是一个可以在这里回答的问题。抛开环境/执行/编译器优化问题:它不仅是一本书的主题,而且具体的书取决于你在谈论什么样的程序,以及性能包络的后果和要求是什么。我猜想对于 99.99% 的程序员来说,switchif/else 语句或类似的窥视孔优化之间的差异(实际上)绝对为零。

古老的格言“让它可读,让它运行,然后在必要时让它快速运行”可能是你最好的行动方案。即使在极其罕见的情况下它可能很重要,但请务必使用分析器来确定真正需要“使其快速运行”阶段的“位置”部分的位置。

【讨论】:

  • 如果想让我的“祖母维生系统”的代码可读可维护,非常感谢。除非你打错字,你的意思是“岳母”
  • 我也是,@PeeHaa。因此,小跑了旧的“使其可读”锯。我不得不在软件故障会产生现实后果(除了金钱)的情况下编写代码,在这些情况下,重点始终放在正确性、可测试性和可读性上——而这些事情通常是亲力亲为的——在手(-in-hand?多少手?)。
  • @PeeHaa:snerk 只需阅读对您评论的编辑即可。你欠我显示器的 Windex。此外,我很遗憾听到您不会为“SeeM3FictionalNetwork”或其他任何东西设计网络或提出 IP 地址分配解决方案。我可能会在自己身上看到 PeeHaa 来阅读它。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2013-01-26
  • 2013-01-31
  • 2011-10-31
  • 2013-09-09
  • 2021-05-05
相关资源
最近更新 更多