3 回答

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
是真的嗎 如果是這樣,有人知道為什么嗎?
在遠(yuǎn)古時(shí)代,當(dāng)仍然用手從熔融硅石中切出計(jì)算機(jī),8位微控制器在地球上漫游以及您的老師年輕(或您的老師的老師年輕)時(shí),就有一條通用的機(jī)器指令稱為減量和跳過(guò)如果為零(DSZ)。熱門匯編程序員使用此指令來(lái)實(shí)現(xiàn)循環(huán)。后來(lái)的機(jī)器得到了更奇妙的指令,但是仍然有很多處理器在上面比較零的東西比與其他東西比較便宜。(即使在某些現(xiàn)代RISC機(jī)器(例如PPC或SPARC)上也是如此,它們保留整個(gè)寄存器始終為零。)
因此,如果將循環(huán)綁定為零而不是N
,那會(huì)發(fā)生什么?
您可以保存注冊(cè)
您可能會(huì)使用較小的二進(jìn)制編碼獲得比較指令
如果前面的指令碰巧設(shè)置了一個(gè)標(biāo)志(可能僅在x86系列機(jī)器上),則您甚至可能不需要顯式的比較指令。
這些差異是否可能導(dǎo)致對(duì)現(xiàn)代亂序處理器上的真實(shí)程序進(jìn)行任何可衡量的改進(jìn)?不大可能。實(shí)際上,即使您在微基準(zhǔn)測(cè)試上也能表現(xiàn)出可衡量的改進(jìn),我會(huì)印象深刻。
摘要:我拍了一下你的老師腦袋! 您不應(yīng)該學(xué)習(xí)有關(guān)如何組織循環(huán)的過(guò)時(shí)的偽事實(shí)。您應(yīng)該了解,關(guān)于循環(huán)的最重要的事情是確保循環(huán)終止,產(chǎn)生正確的答案并且易于閱讀。 我希望您的老師將重點(diǎn)放在重要的東西上,而不是神話。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
以下是某些硬件上可能發(fā)生的情況,具體取決于編譯器可以推斷出所用數(shù)字的范圍:使用遞增循環(huán),您i<N
每次循環(huán)時(shí)都必須進(jìn)行測(cè)試。對(duì)于減量版本,進(jìn)位標(biāo)志(設(shè)置為減法的副作用)可能會(huì)自動(dòng)告訴您是否i>=0
。這樣可以節(jié)省循環(huán)時(shí)間的測(cè)試時(shí)間。
實(shí)際上,在現(xiàn)代流水線處理器硬件上,由于沒(méi)有從指令到時(shí)鐘周期的簡(jiǎn)單1-1映射,因此這些東西幾乎可以說(shuō)是無(wú)關(guān)緊要的。(盡管我可以想象,如果您正在執(zhí)行諸如從微控制器生成精確定時(shí)的視頻信號(hào)之類的事情的話,但是無(wú)論如何您還是會(huì)用匯編語(yǔ)言編寫。)

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
在Intel x86指令集中,構(gòu)建循環(huán)以遞減計(jì)數(shù)到零的過(guò)程通常比以循環(huán)計(jì)數(shù)到非零退出條件的循環(huán)要少。具體來(lái)說(shuō),ECX寄存器傳統(tǒng)上用作x86 asm中的循環(huán)計(jì)數(shù)器,并且Intel指令集具有特殊的jcxz跳轉(zhuǎn)指令,該指令會(huì)測(cè)試ECX寄存器是否為零并根據(jù)測(cè)試結(jié)果進(jìn)行跳轉(zhuǎn)。
但是,除非您的循環(huán)對(duì)時(shí)鐘周期計(jì)數(shù)非常敏感,否則性能差異可以忽略不計(jì)。與遞增計(jì)數(shù)相比,遞減計(jì)數(shù)到零可能會(huì)使循環(huán)的每個(gè)迭代減少4或5個(gè)時(shí)鐘周期,因此,它實(shí)際上是新穎的事物,而不是有用的技術(shù)。
另外,如今,一個(gè)好的優(yōu)化編譯器應(yīng)該能夠?qū)⑾蛏嫌?jì)數(shù)的循環(huán)源代碼轉(zhuǎn)換為向下計(jì)數(shù)的零機(jī)器代碼(取決于您使用循環(huán)索引變量的方式),因此實(shí)際上沒(méi)有任何理由要在其中編寫循環(huán)只是在這里和那里擠壓一個(gè)或兩個(gè)周期的奇怪方法。
- 3 回答
- 0 關(guān)注
- 741 瀏覽
添加回答
舉報(bào)