与直接编译的可执行文件相比,linux .so性能退化

时间:2016-05-11 10:24:12

标签: c++ linux shared-libraries inverted-index

我遇到了困扰我很久的问题。我想知道是否有人可以解决这个问题。

我一直在编写一个反向索引来支持文本检索。我实现了两种支持用户查询的方法,但性能差别很大。

第一种方式:      使用包含支持用户查询的主函数的额外测试文件编译反向索引。

file:InvertedIndex.cpp UserQuery.cpp

编译:

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

第二种方式:       将反向索引编译为动态共享库,测试文件包含链接到动态共享库的主函数。

file: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个关键字测试了很多查询,但这种现象会重复出现。

我无法弄清楚原因。我经常搜索,一无所获。

如果您有任何想法,请帮帮我。

非常感谢。

1 个答案:

答案 0 :(得分:0)

在共享共享库编译行中,您没有指定-O3优化开关,这可能会使您的库例程效率降低。

无论如何,分别编译库然后链接可能会更慢。编译器无法像在将整个事件编译为单个编译单元时那样积极地进行优化(例如,它可能无法内联函数 - 例如库调用函数 - 否则就会出现)