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

Performance c++: Dynamic loading library and loops

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

我用这个函数做运算

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.o):

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

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

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

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

有几个''mysterious''的东西,首先函数版本给出了一些0时间值所以它的行中有缺失点。然后,几乎比硬编码版本少一个数量级。我假设编译器正在优化操作,所以时间不会上升。另一件奇怪的事情是,对于小的 N 值,对象或共享库会提供更好的时间。

这和没有优化是一样的。再次好奇的是,硬编码的启动速度比其他的慢,但现在很明显,优化器是造成平坦曲线的原因。尽管如此,N 参数是程序的一个参数,它在构建时并不固定。

谁能解释一下这种行为?主要问题:有没有办法为大 N 的对象或动态库获得更好的结果?

谢谢

没什么神秘的,很简单:

  1. object_func、dynamic_func 是一样的,除了动态需要更多的时间来加载库。循环的复杂度是O(n),所以图表。

  2. c++ 不仅仅是带有 类 的 c,它还具有谨慎而强大的优化器。所以优化器查看硬代码并将其替换为:

    c = N;

注意:优化器只有在编译时知道 N 和 operation/function 时才能这样做。

行为解释:

对于前两个,编译器优化了代码 (O(1))。对于最后两个,函数显然是调用(O(N)).

如何获得更好的结果:

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