3 回答

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

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

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