2017-07-28 47 views
-1

我在練習構建鏈表,並想到將我的函數分離爲單獨的文件,並將所有內容從主文件中分離出來。使用G ++編譯所花費的時間差異

這是我與

./ 
    functions 
     printlist.cpp 
     functionbcd.cpp 
    functions.h 
    LinkedList.cpp 
    Node.h 

頭文件LinkedList.cpp

#include "functions.h" 
#include <bits/stdc++.h> 
using namespace std; 

頭文件中提出了在functions.h

#include <bits/stdc++.h> 
#include "Node.h" 

頭文件的文件結構「任何實現的功能「.cpp

#include <bits/stdc++.h> 
#include "..\functions.h" 
using namespace std; 

編譯命令

g++ -ggdb -O2 -std=c++14 LinkedList.cpp functions\*.cpp 

現在,如果我繼續上面提到的結構,我的編譯時它比4-5倍在我與主要沿保持和定義所有功能於一身的文件結構的更多。

我無法理解這一點。

如果有更好的方法來構建我的文件並改善編譯時間,請確實告訴。

謝謝。

+3

請閱讀[I爲什麼不應該#包括<比特/ STDC++小時。>?](HTTPS: //stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h)可能與你的問題無關,但不應該一般地完成。 – user0042

+0

這些都是關於翻譯單元以及您在這些功能中所做的事情。如果您可以將您的函數聲明爲「靜態內聯」,則速度差異可能最小。 3ms和5ms的編譯時間不是你需要擔心的。 – vincent

+0

好的,將刪除它,看看它是否有幫助。 – deadpoolAlready

回答

1

每個文件都有一個固定的開銷,即爲每個文件啓動實際的編譯器,包括並解析鏈接器具有的「公共部分」(即庫包含)和一些每文件工作量去做。考慮到你寫的實際代碼是最小的,每個文件的時間成本實際上總是大致相同,並且大致相當於這個固定的開銷;所以,你所看到的行爲並不奇怪。

分離成不同的文件開始變得有意義的性能代價爲主要有兩個原因:

  • 增量構建;如果你有一個大項目(有一個體面的構建系統)並且觸摸一個文件,它只是相應的將被重建的對象模塊(+ link),這比每次編譯一個巨大的文件要快得多;
  • 平行構建; C++編譯器通常是單線程的(這並不奇怪,因爲它們的大部分工作都是嚴格順序的),所以編譯單個文件不能利用當前CPU提供的並行性;但是如果將項目拆分爲單獨的文件,那麼考慮到每個TU的編譯完全獨立於其他目標(目標模塊僅在鏈接器的最後連接在一起),問題會變得尷尬並行。因此,在多個內核上構建時,快速分離多個文件是很有好處的。

(這除了明顯的可維護性優點來自具有不同模塊/類明顯分開的文件)