我遇到了一个困惑了很久的问题。我想知道有没有人可以解决这个问题。与直接编译的可执行文件相比,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'时才需要该标志。 –