在JavaScript中,是否存在在C中创建函数的性能损失?

时间:2014-06-22 02:47:05

标签: c performance optimization

在JavaScript中,编写函数通常会有巨大的性能损失。例如,如果您使用此功能:

function double(x){ return x*2; }
在内循环内部,你可能会大大提高你的性能,因此为密集型应用程序内联这种功能真的很有利可图。这通常适用于C吗?我是否可以自由地为所有内容创建这些函数,并且放心编译器将完成这项工作,还是手工内联仍然很重要?

3 个答案:

答案 0 :(得分:3)

答案是:这取决于。

我目前正在使用MSVC编译器和GCC进行工作项目,我的经验是他们都做得很好。此外,本机代码中函数调用的成本可能非常小,尤其是在不需要在可执行文件外部可访问的函数中(如未在共享库中导出的函数)。对于这些功能,实际实现调用的方式更加灵活。

需要注意的一点是:编译器更容易优化对静态函数的调用。具有外部链接的函数通常需要链接时间优化,因为必须知道实际调用函数的方式和位置以及实现,以进行大量优化或内联。这需要一次检查多个编译单元。

我会说你应该在有意义的地方使用函数,并使代码更容易阅读和维护。通常,可以安全地假设成本比JavaScript中的成本要小。但最后,您必须分析代码以说出更精确的内容。

更新:我想强调在编译单元中内联函数可以,但这需要链接时优化(或整个程序优化)。 GCC(https://gcc.gnu.org/wiki/LinkTimeOptimization)和MSVC(http://msdn.microsoft.com/en-us/library/0zza0de8.aspx)都支持此功能。

现在,如果您可以通过复制函数的主体并将其粘贴到您调用该函数的任何位置来击败编译器,则可能需要使用不同的编译器。

答案 1 :(得分:2)

通常,在启用优化的情况下,gcc将倾向于内联短函数,前提是它们是在中调用它们的同一编译单元中定义的。

此外,如果调用函数和被调用函数位于不同的编译单元中,则无论您请求什么,编译器都无法内联它们。

因此,如果您希望最大化编译器优化函数调用的机会(无需手动内联),则应在.h文件或同一c文件中定义函数调用。它被称为。

答案 2 :(得分:1)

C. Dot中没有内部功能。所以你的问题的其余部分是无关紧要的。

无论如何,C编译器中的“普通”函数可能会也可能不会内联它们(用它的主体替换函数调用)。如果使用“optimize for size”编译代码,可能会因为明显的原因而决定不进行内联。