java的if里有多个if_代码里写很多if会影响效率吗?
看你怎么寫 if.
嵌入很多層if的代碼叫做“箭頭代碼”,是一個(gè)anti-pattern。 這種代碼會(huì)增加程序的循環(huán)復(fù)雜度 (Cyclomatic complexity)
具體可以看這里:Flattening Arrow Code
這里:
總的來說,程序里用if-else是有開銷的。每次condition的判斷就是一個(gè)計(jì)算,但是if-else的存在增加了程序語言的表達(dá)能力,提高了開發(fā)效率。
如果純粹從性能的角度看,不用if-else肯定比用好。但是在某些情況下CPU可以做到讓程序性能近似于沒有if-else的情況。stackoverflow上有一個(gè)經(jīng)典問題:Why is it faster to process a sorted array than an unsorted array?
現(xiàn)代CPU在運(yùn)行到if的時(shí)候,不會(huì)先判斷condition然后再選擇進(jìn)入if-else的哪一個(gè)分支。它們真正做的是直接進(jìn)入一個(gè)分支執(zhí)行,如果猜錯(cuò)則回滾此分支的操作然后換另一個(gè)分支執(zhí)行。如果CPU每次都猜對(duì),就會(huì)讓程序性能接近沒有if-else的情形;反之則會(huì)造成開銷。那么如何讓CPU猜對(duì)呢?如果condition 大部分時(shí)間都是true,少部分時(shí)間是false,那么CPU 就比較好猜,反之,如果condition的值是一個(gè)隨機(jī)值,那么CPU每次就得“瞎猜”,猜對(duì)的概率就會(huì)低了。
當(dāng)然,如果你的if-else不是出現(xiàn)在循環(huán)里,一般不會(huì)造成太大開銷。
=============分割線==============================
回答一下討論區(qū)里的問題。因?yàn)槲乙膊皇亲鯟PU的,就當(dāng)拋磚引玉。希望大家指正!
現(xiàn)代CPU運(yùn)行時(shí)不是一條命令一條命令的執(zhí)行,而是一下讀進(jìn)多條命令,并且對(duì)這些命令進(jìn)行優(yōu)化,生成流水線(pipeline)。優(yōu)化后的流水線的運(yùn)行效率是非常高的。生成流水線也是一個(gè)耗時(shí)的工作。CPU遇到if的條件語句時(shí)根據(jù)分支預(yù)測(cè)器的結(jié)果選擇跳轉(zhuǎn)還是不跳轉(zhuǎn)。并且把相應(yīng)分支里的命令載入生成流水線。CPU同時(shí)還會(huì)并行地執(zhí)行條件語句。如果對(duì)就繼續(xù)執(zhí)行,如果錯(cuò)就把當(dāng)前分支的流水線拋棄然后載入另一個(gè)分支生成流水線。所以如果每次都猜對(duì),程序的運(yùn)行效率就會(huì)基本和沒有if差不多。
總結(jié)
以上是生活随笔為你收集整理的java的if里有多个if_代码里写很多if会影响效率吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想投影机t036价格是多少
- 下一篇: java缓冲输入流_java _io_字