Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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
为什么do-while循环比javascript中的函数调用运行得更快?_Javascript_Node.js - Fatal编程技术网

为什么do-while循环比javascript中的函数调用运行得更快?

为什么do-while循环比javascript中的函数调用运行得更快?,javascript,node.js,Javascript,Node.js,因此,我试图在javascript中模拟Ruby中的块的概念。我想到了一个主意,使用一个只执行一次的do while循环,在while段中有一个false条件。这样,无论任何变量如何,括号中的代码都将始终执行,但只执行一次。此外,我想将其与具有相同行为的常规函数调用在时间方面进行比较。这是我使用的代码: //代码块时间测试 var i=0; var start=new Date.getTime/1000; whilei

因此,我试图在javascript中模拟Ruby中的块的概念。我想到了一个主意,使用一个只执行一次的do while循环,在while段中有一个false条件。这样,无论任何变量如何,括号中的代码都将始终执行,但只执行一次。此外,我想将其与具有相同行为的常规函数调用在时间方面进行比较。这是我使用的代码:

//代码块时间测试 var i=0; var start=new Date.getTime/1000; whilei<100000{ 函数{i++;} } console.lognew Date.getTime/1000-start; //函数调用测试0.0160000324926758 var j=0; var start=new Date.getTime/1000; whilej<100000{ do{j++;}whilefalse; } console.lognew Date.getTime/1000-start; //做一次测试0.002000093460083008问题不在于调用函数太慢;这是因为创建函数很慢。现有代码创建一个新的匿名函数,并在每次循环时执行该函数。这比一次定义一个函数然后多次调用要慢得多,因为函数创建相对较慢

// TEST 1
// Your existing first test creates an anonymous function on every run
//code block time tests
var i = 0;
var start = new Date().getTime()/1000;
while(i < 100000){
  (function(){i++;})()
}
console.log((new Date().getTime()/1000)-start);
// something like 0.009999990463256836 seconds

// TEST 2
// Your second test, with no function at all
var j = 0;
var start = new Date().getTime()/1000;
while(j < 100000){
  do {j++;}while(false);
}
console.log((new Date().getTime()/1000)-start);
// something like 0.0010001659393310547 seconds

// TEST 3
// Here's what happens with a named function, defined only once
function aRealFunction(n) {
    return n+1;
}
var i = 0;
var start = new Date().getTime()/1000;
while(i < 100000){
  i = aRealFunction(i);
}
console.log((new Date().getTime()/1000)-start);
// something like 0.0009999275207519531 seconds - ten times faster
因此,我试图在javascript中模拟Ruby中的块的概念。我想到了一个主意,使用一个只执行一次的do while循环,在while段中有一个false条件

仅供参考,这毫无用处。:-两者之间没有区别

do {
    /* something */
}
while (false);

除了前者涉及更多的代码和无意义的测试。在JavaScript和其他类似语法的大多数语言中,如java、C++、C++和C,一个块不需要与任何事物相关联,它可以是独立的。 但是,函数调用似乎比do while循环慢得多。为什么会这样

原因很多:

您不仅在循环中调用函数,还在循环中创建它

对函数的每次调用都涉及开销:为局部变量创建新的执行上下文和关联的绑定对象,填充该对象,设置该对象的值,等等

从函数中引用i要求JavaScript引擎首先在绑定对象上查找函数调用的执行上下文,然后,如果找不到i,则按照从该上下文到封闭上下文的链接,以便检查其绑定对象的i。例如,遵循闭合链

虽然JavaScript引擎V8(在本例中)可以优化这些内容,但默认情况下,V8的内置编译器是一个两阶段优化编译器:它进行初始快速编译,这是正确的,但不一定是优化的,然后返回并优化那些看起来像热点的内容。某个东西是否是热点的阈值是复杂的,但是优化编译器可能要到第10000次迭代时才会启动,所以您没有看到优化的所有好处


旁注:从ES2015开始,如果一个块包含任何块范围的声明let、const、class等,那么该块将为这些声明获取自己的绑定对象。ES5和早期版本没有块作用域。

为什么需要模拟Ruby块?不是同一个概念吗?哇,我不知道你可以在javascript中有一个匿名块!谢谢@JoshWeinstein:随着ES2015+代码越来越普及,预计它们会变得越来越普遍。我们不再需要作用域函数来避免创建全局函数,我们可以使用作用域块:-
{
    /* something */
}