首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用node,为什么代码使用"use strict“要快得多?

使用node,为什么代码使用"use strict“要快得多?
EN

Stack Overflow用户
提问于 2014-06-02 22:45:09
回答 1查看 4.1K关注 0票数 19

我从来不知道use strict可以加快运行时间,然而一个简单的use strict让我的基准测试快了很多,而慢的则慢得多(慢了两倍多)。到底怎么回事?

代码语言:javascript
复制
//
// RUN WITH AND WITHOUT THIS
//
"use strict";

var assert = require('assert');

var slice = [].slice;

function thunkify_fast(fn){
  assert('function' == typeof fn, 'function required');

  return function(){
    var args = new Array(arguments.length);
    for(var i = 0; i < args.length; ++i) {
      args[i] = arguments[i];
    }
    var ctx = this;

    return function(done){
      var called;

      args.push(function(){
        if (called) return;
        called = true;
        done.apply(null, arguments);
      });

      try {
        fn.apply(ctx, args);
      } catch (err) {
        done(err);
      }
    }
  }
};

function thunkify_slow(fn){
  assert('function' == typeof fn, 'function required');

  return function(){
    var args = slice.call(arguments);
    var ctx = this;

    return function(done){
      var called;

      args.push(function(){
        if (called) return;
        called = true;
        done.apply(null, arguments);
      });

      try {
        fn.apply(ctx, args);
      } catch (err) {
        done(err);
      }
    }
  }
};


var fn = function () { };

var Benchmark = require('benchmark');
var suite = new Benchmark.Suite;


//
// Only one wrapper can be sent through the optimized compiler
//
suite.add( 'thunkify#fast', function () { thunkify_fast(fn)(function(){}) } )
    .add( 'thunkify#slow', function () { thunkify_slow(fn)(function(){}) } )
    .on('cycle', function(event) { console.log(String(event.target)); })
    .on('complete', function() {
        console.log('Fastest is ' + this.filter('fastest').pluck('name'));
    })
    .run();

没有顶层的"use strict",结果就是这样的,

代码语言:javascript
复制
$ node --allow-natives-syntax test.js 
thunkify#fast x 8,511,605 ops/sec ±1.22% (95 runs sampled)
thunkify#slow x 4,579,633 ops/sec ±0.68% (96 runs sampled)
Fastest is thunkify#fast

然而,有了那个"use strict;",我得到了这个,

代码语言:javascript
复制
$ node --allow-natives-syntax test.js 
thunkify#fast x 9,372,375 ops/sec ±0.45% (100 runs sampled)
thunkify#slow x 1,483,664 ops/sec ±0.93% (96 runs sampled)
Fastest is thunkify#fast

我正在运行nodejs v0.11.13。这些都是我使用this guidespeed up node-thunkify所做的工作的一部分。有趣的是,bluebird优化指南并没有提到use strict;的有益性能。

如果我把测试用例改成,

代码语言:javascript
复制
var f_fast = thunkify_fast(fn);
var f_slow = thunkify_slow(fn);
suite.add( 'thunkify#fast', function () { f_fast(function(){}) } )
  .add( 'thunkify#slow', function () { f_slow(function(){}) } )
  .on('cycle', function(event) { console.log(String(event.target)); })
  .on('complete', function() {
    console.log('Fastest is ' + this.filter('fastest').pluck('name'));
  })
  .run();

因此,删除调用thunkify后,我仍然看到相同的情况。use strict的情况在未优化的代码上较慢,在优化的代码上较快,

不严格

代码语言:javascript
复制
thunkify#fast x 18,910,556 ops/sec ±0.61% (100 runs sampled)
thunkify#slow x 5,148,036 ops/sec ±0.40% (100 runs sampled)

“使用严格的;”

代码语言:javascript
复制
thunkify#fast x 19,485,652 ops/sec ±1.27% (99 runs sampled)
thunkify#slow x 1,608,235 ops/sec ±3.37% (93 runs sampled)
EN

回答 1

Stack Overflow用户

发布于 2014-06-05 22:57:37

这种缓慢的原因是在ArraySlice内置的this check中。它测试我们是否正在尝试对参数对象进行切片,如果是,则使用快速代码来实现。然而,它只检查松散的模式参数对象。当您在strict函数中分配arguments对象时,您将获得由native_context()->strict_arguments_boilerplate()生成的严格模式arguments对象,这意味着上面的检查无法识别它,并落入通用的JavaScript代码,它比专门的手工编码的C++快速路径要慢,因为它是一个草率的参数对象。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23997267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档