调用更多函数是否会对性能产生任何明显的影响,或者是否试图减少函数调用的次数而进行无意义的过早优化?
简化示例:这之间是否有任何真实的性能示例:
function foo($var) {
echo $var;
}
foo();
而且这个:
function foo($var) {
bar($var);
}
function bar($var) {
baz($var);
}
function baz($var) {
echo $var;
}
foo();
答案 0 :(得分:7)
这是不成熟的优化。根据您的域以及代码中任务的逻辑分离,您应该具有有意义的功能。唯一一次我会考虑用内联代码替换一个函数是因为它是一个紧凑的循环而且一个分析器显示它是一个问题。
为了更直接地回答你的问题,对性能的影响取决于很多事情:
决定某项功能是否属于功能应该由逻辑分离,清晰度,可维护性等驱动,而不是性能。
答案 1 :(得分:6)
始终先进行性能分析,然后再进行优化。
另一方面,函数调用确实有一些开销,但在决定优化函数调用之前,你应该真正地编写代码。
答案 2 :(得分:3)
以最简单的方式回答你的问题。
现在,对于更长的答案,函数开销非常小,在您对特定函数进行至少几百次调用之前,您不会开始注意它。在大多数UI程序中,很少发生对方法的数百万次调用。除了与调用函数相关的开销之外,函数内部对性能的贡献要大得多。
进一步说明我的观点。计算机在纳秒时间范围内运行。人类可以检测到大约10毫秒(来自UI测试)。 1ms = 1.0×10 ^ 6 ns。因此,如果需要1ns来调用你的功能,你需要在人类可以分辨出它之前调用它在100万到1000万次之间。
如果一个函数的内容调用起来很昂贵,那么当你调用它时减少它可以帮助提高性能,但是这又与函数内部的内容有关,而不是调用函数的行为。
在测量之前,切勿尝试优化。我会再次说它永远不会尝试预测你的应用程序中的性能。始终使用分析器测量性能。这就像在编写程序之前尝试预测程序中的错误一样。
答案 3 :(得分:1)
函数调用的开销实际上非常严重。但在宏伟的计划中它仍然很低。如果您在执行过程中只对链条进行了几次调用,请不要担心。如果您要循环很多,那么您可能需要考虑优化它。
但请记住,最大的性能提升是从非工作状态转变为工作状态。只有这样才能开始解决实际的瓶颈......永远不要忘记:Premature optimization is the root of all evil
...
答案 4 :(得分:1)
我不会担心速度与内存有关,因为每个函数调用都需要堆栈。同样,在像你这样的例子中担心这会是过早的优化,但是如果你计划用一种没有优化处理递归函数调用的语言的递归算法,那么记住它是件好事。