2016-05-11 59 views
0

我遇到了一個困惑了很久的問題。我想知道有沒有人可以解決這個問題。與直接編譯的可執行文件相比,linux .so的性能退化

我一直在寫一個倒排索引來支持文本檢索。我實現了兩種方式來支持用戶查詢,但性能差別很大。

第一種方式: 使用包含支持用戶查詢的主函數的額外測試文件編譯倒排索引。

文件:InvertedIndex.cpp UserQuery.cpp

編譯:

 g++ -g -Wall -O3 -fPIC -o textSearch1 InvertedIndex.cpp UserQuery.cpp -I ... -L ... 

第二種方式: 編譯倒排索引作爲動態共享庫,測試文件中包含鏈接到動態主功能共享庫。

文件:InvertedIndex.cpp UserQuery.cpp

編譯:

 g++ -shared -fPIC -o libInveredIndex.so InvertedIndex.cpp -I ... -L ... 
    g++ -Wall -O3 -fPIC -o textSearch2 UserQuery.cpp -I ... -L ... -l InveredIndex 

我在預建倒排索引文件測試兩個textSearch1和textSearch2,以及查詢時間相差很大。倒排索引文件由mmap加載。

對於相同的查詢(超過2個關鍵字),textSearch2花費的時間是textSearch1花費的時間的兩倍。

我測試了2個以上關鍵字的很多查詢,但現象重複。

我找不出原因。我搜查了很多,什麼都沒找到。

如果您有任何想法,請幫助我。

非常感謝。

+0

請注意,編譯可執行文件時不需要'-fPIC',只有在編譯用於共享庫的'.o'時才需要該標誌。 –

回答

0

在共享共享庫編譯行中,您沒有指定-O3優化開關,這很可能會使您的庫例程效率降低。

無論如何,單獨編譯庫然後鏈接可能會變慢。如果編譯器將整個事件編譯爲單個編譯單元(例如,它可能無法內聯函數 - 例如庫函數),編譯器將無法進行優化,否則它將會如此。

相關問題