我注意到我的C程序性能有很大差异,具体取决于-fPIC标志。当我使用它时,我的程序比没有它的程序慢约30%。 我将它与一个调用C函数的Lua程序进行比较(所有繁重的计算都完成了)。首先,我使用C函数创建了一个共享对象,因此必须使用-fPIC标志。性能与带有-fPIC标志的C代码非常相似。 所以现在我尝试了同样没有.so:我从C调用了Lua:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "my_c_function", my_c_function);
luaL_dofile(L, "my_lua_program.lua");
lua_close(L);
return 0;
}
但是,无论我是否使用-fPIC标志(与使用.so的方法相同),这里的性能都是相同的。如果没有-fPIC标志,我期待一些改进...有关如何进一步调查的任何建议?第二种方法是否创建了与位置无关的代码,这就是性能相似的原因?谢谢!
更多信息,如评论所示: 我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64。是的,我对这么大的开销感到非常惊讶......我的程序正在计算Mandelbrot分形。所以有两个循环迭代x和y,我在C中的函数是isMandelbrot:它需要迭代次数并返回bool:属于Mandelbrot set或者不属于Mandelbrot。我将共享对象与'require'一起使用。
答案 0 :(得分:1)
我认为您运行的代码是x86。此平台与-fPIC存在性能问题,其中任何导入函数的位置都需要找到本地eip。执行此操作的代码会为函数增加一小部分开销。不幸的是,lua充满了非常小的功能,它会增加相对开销。
在x64 -fPIC上没有这种开销。
答案 1 :(得分:-4)
好的,首先,如果你用c程序或lua调用c程序几乎没有区别,但是,每次创建c程序时你都会创建谁; e独立程序,所有系统头都弹出,然后,在完成正在做的事情之后,它会报告值。我的观点是,问题可能不是“调用”函数,而是多少和多快,因为在调用程序后还有很多工作要做。
o3优化标志不是很健康,所以如果你这样做了一次你可能也想尝试-Ofast,只是不使用-Os它可能只会做更糟糕的事情......
提高性能的最简单方法是优化c代码,您可能希望在编译期间尝试优化标志。 Here是一大堆标志和GCC编译器下的大量文档。请注意,并非所有这些都是安全的,并非所有这些都是真正需要的,因此请分析您的代码并仅选择您需要的代码。
优化代码的第二种方法被认为有点困难。你可能想在启动lua脚本时启动一个C程序,然后在运行时交换信息(并行),这样你就不需要在每次调用时调用整个程序来显示
第三,最难的方法,让你的C代码创建n个线程,其中n< =处理器逻辑核心,以便它们可以独立工作。如果你不介意的话,C / c ++代码擅长数学,但有更好的语言,你可以获得更多的性能,如Fortran,APL,Matlab,Haskel,R,或者如果你已经足够疯狂了,你有熟悉数学问题 - 使用GPU而不是CPU - > Shader Language,我也使用它们来处理某些奇怪的东西,甚至不接近Graphics,但它对我来说很有用。