【问题标题】:linux .so performance degenerate compared to direct compiled executable file与直接编译的可执行文件相比,linux .so 性能下降
【发布时间】:2016-05-11 10:24:12
【问题描述】:

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

我一直在写一个倒排索引来支持文本检索。我实现了2种方式来支持用户查询,但是性能差别很大。

第一种方式: 使用包含支持用户查询的主要功能的额外测试文件编译倒排索引。

文件: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以用于共享库时才需要该标志。

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


【解决方案1】:

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

无论如何,单独编译库然后链接可能会更慢。编译器无法像将整个事物作为单个编译单元编译时那样积极优化(例如,它可能无法内联函数 - 例如库调用函数 - 否则它会)

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多