2016-05-11 21 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优化开关,这很可能会使您的库例程效率降低。

无论如何,单独编译库然后链接可能会变慢。如果编译器将整个事件编译为单个编译单元(例如,它可能无法内联函数 - 例如库函数),编译器将无法进行优化,否则它将会如此。

相关问题