簡體   English   中英

為什么一項任務比另一項任務更快?

[英]Why is one assignment faster than the other?

我聽到很多人說

int a = 0;
a += 10;

比...快

int a = 0;
a = a + 10;

這是為什么? 我用gdb調試了它,它是完全相同的指令。

gdb:

第一

(gdb) list
1   int main()
2   {
3       int counter = 0;
4       counter = counter + 10;
5       return 0;
6   }
(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004004cc <+0>: push   %rbp
   0x00000000004004cd <+1>: mov    %rsp,%rbp
   0x00000000004004d0 <+4>: movl   $0x0,-0x4(%rbp)
   0x00000000004004d7 <+11>:    addl   $0xa,-0x4(%rbp)
=> 0x00000000004004db <+15>:    mov    $0x0,%eax
   0x00000000004004e0 <+20>:    pop    %rbp
   0x00000000004004e1 <+21>:    retq   
End of assembler dump.

第二

(gdb) list
1   int main()
2   {
3       int counter = 0;
4       counter += 10;
5       return 0;
6   }

(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004004cc <+0>: push   %rbp
   0x00000000004004cd <+1>: mov    %rsp,%rbp
   0x00000000004004d0 <+4>: movl   $0x0,-0x4(%rbp)
   0x00000000004004d7 <+11>:    addl   $0xa,-0x4(%rbp)
=> 0x00000000004004db <+15>:    mov    $0x0,%eax
   0x00000000004004e0 <+20>:    pop    %rbp
   0x00000000004004e1 <+21>:    retq   
End of assembler dump.

那么,為什么“(變量)+ =(值)”比“(變量)=(變量)+(值)”更快?

不快。 如您所見,生成的程序集是相同的。 誰告訴你一個更快的速度就是在編故事。

就像其他人所說的,在這種情況下沒關系。 但是,有一些類似但非常不同的情況:

int *f(void);
(*f()) = (*f()) + 1;
(*f()) += 1;

在第二行中, f()被調用兩次,在第三行中,僅被調用一次。

int * volatile *p;
**p = **p + 1;
**p += 2;

在第二行中,編譯器將讀取*p兩次,並假設它在兩次訪問之間可能會發生變化(並且您將讀一個地方,寫另一個地方)。 在第3個中,它將讀一次*p並遞增該位置。

如果您感到頑皮:

#define a *f()
int a;
a = a + 1;
a++;

看起來幾乎與問題中的一樣,但行為與我的第一個示例類似。

我認為您剛剛證明,無論使用哪種c編譯器,它都根本不快。 但是,您可能在編譯過程中運行了優化。 另外,其他編譯器可能不會以相同的方式進行操作。

我認為他們所說的“更快”是指輸入a += 10比輸入a = a + 10更容易。 兩者都完全相同。

您必須在逐個編譯器的基礎上並逐個選項地進行研究。 未優化的代碼可能會生成不同的代碼,但是同時,即使對於這一行代碼,未優化的代碼也可能會慢得多。 真正的答案與編譯器內部有關,使用clang / llvm可以很容易地看到編譯器的內部,但也許可以與gcc等一起使用。 到了生成匯編的時候,編譯器往往會擁有內部通用代碼來進行一些優化,然后最終轉換為匯編/機器代碼將進一步針對特定目標進行優化。 您的問題的有趣答案是,編譯器前端如何使用這兩行微妙的不同代碼行? 如果不是從一開始就不是那一點,那么這兩者在匯編/機器代碼輸出的途中或在什么時候會變成相同的結果?

否。您的信息不正確。 兩條指令占用相同的時間。

int a = 0;
a += 10;

int a = 0;
a = a + 10;

生成相同的匯編代碼並且速度相同。

暫無
暫無

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

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