性能 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 的对象或动态库获得更好的结果?
谢谢
没什么神秘的,很简单:
object_func、dynamic_func 是一样的,除了动态需要更多的时间来加载库。循环的复杂度是O(n),所以图表。
c++ 不仅仅是带有 类 的 c,它还具有谨慎而强大的优化器。所以优化器查看硬代码并将其替换为:
c = N;
注意:优化器只有在编译时知道 N 和 operation/function 时才能这样做。
行为解释:
对于前两个,编译器优化了代码 (O(1))。对于最后两个,函数显然是调用(O(N)).
如何获得更好的结果:
您应该将 N 值作为参数传递给动态加载的函数,并在函数内部执行循环,以避免在大 N 上的函数调用开销。
我想快速迭代动态加载的库符号。为了查看与硬编码函数相比我可以获得多少性能,我对一个简单的加法操作做了一些基准测试。
我用这个函数做运算
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 的对象或动态库获得更好的结果?
谢谢
没什么神秘的,很简单:
object_func、dynamic_func 是一样的,除了动态需要更多的时间来加载库。循环的复杂度是O(n),所以图表。
c++ 不仅仅是带有 类 的 c,它还具有谨慎而强大的优化器。所以优化器查看硬代码并将其替换为:
c = N;
注意:优化器只有在编译时知道 N 和 operation/function 时才能这样做。
行为解释:
对于前两个,编译器优化了代码 (O(1))。对于最后两个,函数显然是调用(O(N)).
如何获得更好的结果:
您应该将 N 值作为参数传递给动态加载的函数,并在函数内部执行循环,以避免在大 N 上的函数调用开销。