【发布时间】:2023-03-24 20:53:01
【问题描述】:
我注意到我的 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 集。我将共享对象与“require”一起使用。
【问题讨论】:
-
您使用了哪些确切的编译标志?什么版本的编译器?什么平台和系统?什么处理器架构?位置无关代码的 30% 开销似乎是可疑的(通常是百分之几)。你的
my_c_function是做什么的?如果可能,显示它的源代码......你如何加载你的共享对象? -
@Basile Starynkevitch - 谢谢。我用更多信息更新了这个问题。源代码的哪一部分有用?这是一个小程序,但我想在发布之前我需要做得更小。
-
其实你的问题让我意识到为什么第二个版本没有显示出任何改进:我在 lua 代码中留下了'require'语句,所以仍然调用共享对象....不解释为什么 -fPIC 开销如此之大,但我想这应该在另一个问题中解决。再次感谢。
-
如果可能,仔细检查 C 代码是如何编译的,显示确切的编译命令和实际代码。您的
my_c_function多久打一次电话?它运行多长时间?我对你 30% 的数字感到非常惊讶。 -
@Basile Starynkevitch 我发布了一个单独的问题(因为故事的 lua 部分不再相关),其中包含所有详细信息 here。
标签: c performance gcc lua