Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 退出函数以减少激活对象的数量比递归或调用嵌套函数更好吗?_Javascript_Performance_Function_Optimization_Activation - Fatal编程技术网

Javascript 退出函数以减少激活对象的数量比递归或调用嵌套函数更好吗?

Javascript 退出函数以减少激活对象的数量比递归或调用嵌套函数更好吗?,javascript,performance,function,optimization,activation,Javascript,Performance,Function,Optimization,Activation,在JavaScript和其他语言中,我听说在调用方法/函数时会创建激活对象。为了优化和保持良好的性能,开发人员似乎应该限制调用的函数数量 现在,如果没有办法,您必须调用多个方法,那么最好一个接一个地调用一个方法,如下所示: myFunc1(); myFunc2(); myFunc3(); // or... var myFuncs = [myFunc1, myFunc2, myFunc3]; for(var a=0, aLen=myFuncs.length; a<aLen; a++) {

在JavaScript和其他语言中,我听说在调用方法/函数时会创建激活对象。为了优化和保持良好的性能,开发人员似乎应该限制调用的函数数量

现在,如果没有办法,您必须调用多个方法,那么最好一个接一个地调用一个方法,如下所示:

myFunc1();
myFunc2();
myFunc3();

// or...
var myFuncs = [myFunc1, myFunc2, myFunc3];
for(var a=0, aLen=myFuncs.length; a<aLen; a++) {
  myFuncs[a]();
}
function myFunc1() {
  // Do something...
  myFunc2();
}

function myFunc2() {
  // Do Something else...
  myFunc3();
}

function myFunc3() {
  //Do one last thing.
}

//Start the execution of all 3 methods:
myFunc1();
我认为使用第一种技术更有意义,因为它返回到以前的范围并释放最后一个激活对象。。。但如果有人能证实这一点, 我真的很想知道


谢谢

职责分离:

private function myFunc1(): void
{

}

private function myFunc2(): void
{

}

private function myFunc3(): void
{

}

private function doAllFunc(): void
{
     myFunc1();
     myFunc2();
     myFunc3();
}

有关激活对象的信息,请参阅

然而,这不是一个优化级别的问题,因为您列出的问题是一个极端预优化的例子,您的时间不值得这样的投资。实际上,在上面列出的示例中,当您单独查看激活对象时,几乎没有节约

然而,为了正确使用,我尽可能地封装。如果一个函数不必进入全局范围,并且可以存在于另一个函数的范围内,那么应该在那里声明它

例如,为了更好地确定范围


var f2 = function() {
}

var f1 = function() {
  f2()
}

// is not as nice as:

var f1 = function() {
  var f2 = function()

  f2()
}

// or even better.. 

var f1 = function() {
  function() {
  }()  ; execute
}

为了优化和保持良好的性能,开发人员似乎应该限制调用的函数数量

是和否。要调用函数(或者更一般地说,子例程),不这样做没有意义。如果通过引入另一个函数可以使代码更加枯燥,那么就这样做

唯一不使用它们的地方是高性能循环,它运行数千次,几乎不做任何工作,函数调用会增加明显的开销。不要试图这样做

另外,有些语言处理递归不太好,您需要将递归函数调用转换为循环,以防止堆栈溢出异常。然而,这也是一种罕见的情况

一个接一个地调用一个方法,还是嵌套它们更好

这要视情况而定,因为这两种技术做的事情不同。对于#1,只有3个相互独立的函数被调用。相反,#2定义了总是互相调用的函数-如果没有
myFunc3
,则无法获得
myFunc2
。这是有意的吗


如果是的话,这种筑巢没有什么问题。这两个额外的堆栈层不会损害您的性能。

我相信按顺序调用方法将具有最佳性能。循环中的额外变量会带来开销,嵌套函数调用将使每个函数的激活对象保持活动状态,直到所有函数都完成执行。以最符合逻辑(和可读性)的方式构造代码。不要嵌套函数,除非它们实际上相互依赖以特定顺序执行某些操作,例如,如果部分通过
myFunc1()
它实际上需要
myFunc2()的结果。只有在您真正注意到问题时才担心性能。(注意:您所展示的示例中没有递归。)您使用嵌套函数调用()而不是默认的线性函数调用的原因是什么,是否涉及一些异步代码?@nnnn我意识到示例中没有递归,但递归也是一种嵌套在彼此内部的函数形式,可能会导致激活对象的深层链。@Bergi我基本上只是询问性能更好的函数。例如,如果您正在为解析/导出工具编写一些子例程(这些子例程相互依赖),您是希望逐个单独调用这些方法/在数组中迭代它们,还是希望按照执行顺序将它们嵌套在每个方法中?这基本上是我的问题。加里,你知道你在回答一个Javascript问题,对吗?看起来像是C/C++,不是Javascript。同意,但那是什么语言?@RobertK-哦,请。jbabey这是Pierre(提问者)非常熟悉的ActionScript,因为它是他的主要语言。问题是javascript的性能,而不是如何最好地用另一种语言编写他的任意示例。投票点不转换成美元是件好事。有些用户过于重视信誉积分。谢谢Gary,责任分离是需要考虑的一个好方面。听起来也有道理:易于阅读和理解的代码=易于执行的代码。(但显然,它可能不是所有情况下最快的!)很高兴知道。我不太熟悉JavaScript解释器/引擎在方法完成后释放内存的方式。有没有一种方法可以让垃圾收集器更方便地标记和丢弃内存(假设JavaScript有某种GC处理程序)?我意识到3个子例程太小,无法真正测量出显著的差异,但是如果方法被迭代几百次,并且一些任务比其他任务更昂贵(在我的例子中,我编写一些JSFL脚本来自动化Flash PNG导出),那么这个技术听起来更有效。