8

我注意到根据 -fPIC 标志,我的 C 程序的性能存在很大差异。当我使用它时,我的程序比没有它时慢 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 集。我将共享对象与“require”一起使用。

4

2 回答 2

1

我认为您正在运行的代码是 x86。该平台在使用 -fPIC 时存在性能问题,其中任何导入函数的位置都需要找到本地 eip。执行此操作的代码为函数增加了一点开销。不幸的是lua充满了非常小的函数,它会增加相对开销。

在 x64 -fPIC 上没有这个开销。

于 2015-08-20T06:37:22.587 回答
-4

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

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

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

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

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

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

于 2013-11-15T20:21:27.863 回答