簡體   English   中英

為什么一個代碼示例比其他代碼需要更多時間執行?

[英]Why one sample of code take more time to execute than other?

樣本1

for(int i = 0 ; i <= 99 ; i++)
    printf("Hello world");

樣本2

printf("Hello world"); // 1st print
printf("Hello world"); // 2nd print
.
.
.
printf("Hello world"); // 100th print

我知道示例1比示例2需要更多的時間來執行,示例2在文本段中需要更多的內存。

但是,我想知道幕后發生的事情。

想象一下這樣編寫的示例操作序列:

i = 0
if (i <= 99)
print
i++
jump
if (i <= 99)
print
i++
jump
if (i <= 99)
print
i++
jump
...

第二個示例很簡單:

print
print
print
print
...

這是極其簡化的,但是您應該明白這一點-第一個示例執行了更多的指令來遍歷循環。

附帶說明-這是編譯器經常進行的優化之一-它將展開循環並像沒有循環一樣對其進行編譯。 為此,必須得出值得的結論-請注意,示例二將編譯成更多的指令總數,並且將占用更多的內存空間(因此將花費更長的時間加載)。

如果編程正確,示例2中的代碼可以更快。

如您所描述的,有100個對printf(“ ...”)的調用; 與參數相同的字符串。 如果編譯器是優化的編譯器,則它可以檢測到您傳遞的參數完全相同,並且在調用之后不彈出指針,因此無需在下次調用時再次將其推入。

同樣,循環之間速度的差異是返回到循環開始所花費的時間。 在當前的架構下,這甚至可能是一個優勢,因為整個循環代碼都由CPU緩存(這不能通過大量類似的調用集來完成),並且無需進行任何內存訪問即可加載指令,以補償執行循環指令所花費的時間。

但是...即使,即使是使用良好的優化編譯器,它也可以檢測到您將相同的句子放置了100次並用隱藏的控制變量(如示例1)將fold'em循環放入了循環中,因此您不會有任何區別及時執行。

優化的編譯器用於檢測此類構造並更改代碼以提高效率。

這種材料的一個很好的參考是: http : //en.wikipedia.org/wiki/Compilers : _Principles,_Techniques,_and_Tools

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM