我想快速迭代动态加载的库符号。为了看看与硬编码函数相比我可以获得多少性能,我为一个简单的加法操作做了一些基准测试。
我使用此功能进行操作
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编译的所有内容:
有一些神秘的&#39;&#39;事情,首先功能版本给出一些0时间值,所以它的行中缺少点。然后,几乎比硬编码版本小一个数量级。我认为编译器正在优化操作,因此时间不会上升。另一个奇怪的事情是,对于小N值,对象或共享库提供更好的时间。
没有优化也是如此。再次感到奇怪的是,硬编码比其余编码开始慢,但现在显然优化器负责平曲线。尽管如此,N参数是程序的参数,它在构建时不固定。
任何人都可以解释这种行为吗?主要问题是:对于大型N,是否有办法为对象或动态库获得更好的结果?
由于
答案 0 :(得分:1)
没有什么神秘的,很简单:
object_func,dynamic_func是相同的东西,除了dinamic需要更多的时间来加载库。周期的复杂性是O(n),所以图表。
c ++不只是带有类的c,它还有一些强大的强大优化器。因此优化器会查看硬编码并将其替换为:
c = N;
注意:优化器只有在编译时知道N和操作/函数时才能这样做。
答案 1 :(得分:1)
行为解释:
对于前两个,编译器优化了代码(O(1))。对于后两个,该函数显然被称为(O(N))。
如何获得更好的结果:
您应该将N值作为参数传递给动态加载的函数,并在函数内部执行循环,以避免大N上的函数调用开销。