性能c ++:动态加载库和循环

时间:2015-03-05 00:31:34

标签: c++ performance shared-libraries

我想快速迭代动态加载的库符号。为了看看与硬编码函数相比我可以获得多少性能,我为一个简单的加法操作做了一些基准测试。

我使用此功能进行操作

long int func(long int x)
{
    return x+1;
}

然后循环测试时间

硬编码:

for(i=0;i<N;i++)
    c = c + 1;

使用该函数(在循环所在的同一文件中定义):

for(i=0;i<N;i++)
    c = func(c);

使用链接对象的func(func.o):

for(i=0;i<N;i++)
    c = object_func(c);

使用来自动态加载符号的func(使用dlopen和dlsym)

for(i=0;i<N;i++)
    c = dynamic_func(c);

这是不同N值的结果,以及使用g ++ -Ofast编译的所有内容: enter image description here

有一些神秘的&#39;&#39;事情,首先功能版本给出一些0时间值,所以它的行中缺少点。然后,几乎比硬编码版本小一个数量级。我认为编译器正在优化操作,因此时间不会上升。另一个奇怪的事情是,对于小N值,对象或共享库提供更好的时间。

没有优化也是如此。再次感到奇怪的是,硬编码比其余编码开始慢,但现在显然优化器负责平曲线。尽管如此,N参数是程序的参数,它在构建时不固定。 enter image description here

任何人都可以解释这种行为吗?主要问题是:对于大型N,是否有办法为对象或动态库获得更好的结果?

由于

2 个答案:

答案 0 :(得分:1)

没有什么神秘的,很简单:

  1. object_func,dynamic_func是相同的东西,除了dinamic需要更多的时间来加载库。周期的复杂性是O(n),所以图表。

  2. c ++不只是带有类的c,它还有一些强大的强大优化器。因此优化器会查看硬编码并将其替换为:

    c = N;

  3. 注意:优化器只有在编译时知道N和操作/函数时才能这样做。

答案 1 :(得分:1)

行为解释:

对于前两个,编译器优化了代码(O(1))。对于后两个,该函数显然被称为(O(N))。

如何获得更好的结果:

您应该将N值作为参数传递给动态加载的函数,并在函数内部执行循环,以避免大N上的函数调用开销。