我遇到了一個困惑了很久的問題。我想知道有沒有人可以解決這個問題。與直接編譯的可執行文件相比,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個以上關鍵字的很多查詢,但現象重複。
我找不出原因。我搜查了很多,什麼都沒找到。
如果您有任何想法,請幫助我。
非常感謝。
請注意,編譯可執行文件時不需要'-fPIC',只有在編譯用於共享庫的'.o'時才需要該標誌。 –