Lua调用C函数的性能

Ola*_*a M 8 c performance lua gcc

我注意到我的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;
}
Run Code Online (Sandbox Code Playgroud)

但是,无论我是否使用-fPIC标志(与使用.so的方法相同),这里的性能都是相同的.如果没有-fPIC标志,我期待一些改进...有关如何进一步调查的任何建议?第二种方法是否创建了与位置无关的代码,这就是性能相似的原因?谢谢!

更多信息,如评论所示:我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.是的,我对这么大的开销感到非常惊讶......我的程序正在计算Mandelbrot分形.所以有两个循环迭代x和y,我在C中的函数是isMandelbrot:它需要迭代次数并返回bool:属于Mandelbrot set或者不属于Mandelbrot.我将共享对象与'require'一起使用.

Esa*_*ier -4

好吧,首先,如果你用 c 程序或用 lua 调用 c 程序几乎没有区别,但是,每次创建 c 程序时,你都在创建一个独立的程序,所有系统头都会弹出,然后,当它完成正在做的事情后,它会报告值。我的观点是,问题可能不是“调用”函数,而是“调用”函数的数量和速度,因为调用程序后还有很多事情要做。

o3 优化标志不是很健康,所以如果你这样做了一次,你可能还想尝试 -Ofast,只是不使用 -Os 它可能会让事情变得更糟......

提高性能的最简单方法就是优化 C 代码,您可能想在编译期间尝试优化标志。是关于 GCC 编译器下的全部标志和大量文档。请注意,并非所有这些都是安全的,也并非所有都是真正需要的,因此请分析您的代码并仅选择您需要的那些。

第二种优化代码的方法被认为有点困难。您可能想在启动 lua 脚本时启动 C 程序,然后在运行时(并行)交换信息,这样您就不需要每次调用时都调用整个程序来显示

第三种,也是最难的方法,让你的 C 代码创建 n 个线程,其中 n<= 处理器逻辑核心,这样它们就可以独立工作。

另外,如果你不介意的话,C/C++ 代码擅长数学,但是有更好的语言可以获得更高的性能,例如 Fortran、APL、Matlab、Haskel、R,或者如果你足够疯狂并且你有很好的知识数学问题 - 使用 GPU 而不是 CPU -> 着色器语言,我也将它们用于某种奇怪的东西,甚至不接近图形,但它对我有用。