If statement 是";如果;贵吗?

If statement 是";如果;贵吗?,if-statement,language-agnostic,branch-prediction,If Statement,Language Agnostic,Branch Prediction,我记不得那天老师说的话,我希望你可能知道 该模块是“数据结构和算法”,他向我们介绍了以下内容: if语句是最昂贵的 [某物]。[某物]登记 [某物] 是的,我确实有一个可怕的记忆,我真的很抱歉,但我已经在谷歌上搜索了几个小时,什么都没有出现。有什么想法吗?分支可能会终止CPU指令预取?昂贵是一个非常相对的术语,特别是与“if”语句的关系,因为您还必须考虑条件的成本。这可能包括从几个简短的cpu指令到测试调用远程数据库的函数的结果 我不会担心的。除非你在做嵌入式编程,否则你可能根本不应该担心“if

我记不得那天老师说的话,我希望你可能知道

该模块是“数据结构和算法”,他向我们介绍了以下内容:

if
语句是最昂贵的 [某物]。[某物]登记 [某物]


是的,我确实有一个可怕的记忆,我真的很抱歉,但我已经在谷歌上搜索了几个小时,什么都没有出现。有什么想法吗?

分支可能会终止CPU指令预取?

昂贵是一个非常相对的术语,特别是与“
if
”语句的关系,因为您还必须考虑条件的成本。这可能包括从几个简短的cpu指令到测试调用远程数据库的函数的结果


我不会担心的。除非你在做嵌入式编程,否则你可能根本不应该担心“
if
”的成本。对于大多数程序员来说,它永远不会成为应用程序性能的驱动因素。

我能想象的唯一一件事可能是,一个
if
语句通常会导致分支。根据处理器体系结构的具体情况,分支可能导致管道暂停或其他非最佳情况

然而,这是非常具体的情况-大多数现代处理器都有分支预测功能,试图最小化分支的负面影响。另一个例子是ARM体系结构(可能还有其他体系结构)如何处理条件逻辑——ARM具有指令级条件执行,因此简单的条件逻辑不会导致分支——如果不满足条件,则指令只是作为NOP执行


所有这些-在担心这些事情之前,先把你的逻辑弄清楚。不正确的代码是无法优化的。

分支,特别是在RISC体系结构微处理器上,是一些最昂贵的指令。这是因为在许多体系结构上,编译器预测最有可能采用的执行路径,并将这些指令放在可执行文件中的下一个,因此当发生分支时,它们已经在CPU缓存中了。如果分支走另一条路,它必须返回主内存并获取新指令——这相当昂贵。在许多RISC体系结构上,除分支(通常为2个周期)外,所有指令都是一个周期。我们这里说的不是主要成本,所以不用担心。此外,编译器在99%的时间里都会比您做得更好:)EPIC体系结构(安腾就是一个例子)的一个非常棒的地方是,它缓存(并开始处理)来自分支两侧的指令,然后在分支结果已知后丢弃它不需要的集合。如果典型架构沿着不可预测的路径分支,这将节省额外的内存访问。

在最低可能级别
上,如果
包括(在计算特定
的所有应用程序特定先决条件后,如果
):

  • 一些测试说明
  • 如果测试成功,跳转到代码中的某个位置,否则继续
与此相关的成本:

  • 低级别比较——通常是1个cpu操作,非常便宜
  • 潜在的跳跃——可能很昂贵
跳转成本高昂的原因:

  • 你可以跳转到内存中任何地方的任意代码,如果它不是由cpu缓存的——我们有一个问题,因为我们需要访问主内存,这是比较慢的
  • 现代CPU做分支预测。他们试图猜测if是否会成功,并在管道中提前执行代码,从而加快速度。如果预测失败,则管道提前完成的所有计算都将失效。这也是一项昂贵的手术
综上所述:

  • 如果你真的,真的,真的,真的很在乎表现,那么你可能会很奢侈
  • 当且仅当您正在编写实时光线跟踪器或生物模拟或类似的东西时,您才应该关心它。在现实世界中,没有理由去关心它

    • CPU采用了深度流水线。任何分支指令(if/for/while/switch/etc)都意味着CPU不知道下一步加载和运行什么指令

      CPU要么在等待知道该做什么时暂停,要么进行猜测。在旧CPU的情况下,或者如果猜测是错误的,那么当它运行并加载正确的指令时,您将不得不经历管道暂停。根据CPU的不同,这可能高达10-20条指令的暂停时间

      现代CPU试图通过做好分支预测来避免这种情况,同时执行多条路径,只保留实际路径。这很有帮助,但只能做到这一点

      祝你在班上好运


      此外,如果你在现实生活中不得不担心这一点,你可能正在做操作系统设计、实时图形、科学计算或类似的CPU受限的事情。不要担心。现代处理器有很长的执行管道,这意味着在不同的阶段同时执行多条指令。当下一条指令开始运行时,它们可能并不总是知道一条指令的结果。当它们遇到条件跳转(if)时,有时必须等到管道为空之后才能知道指令指针应该走哪条路

      我认为这是一列长长的货运火车。它能在直线上快速运载大量货物,但转弯不好

      奔腾4(普雷斯科特)有一条著名的31级长管道


      如果

      本身是而不是慢的话,更多关于

      的信息。缓慢总是相对的,我敢打赌,我的一生中,你从来没有感觉过