bauer's diary

凡人の凡人による凡人のための備忘録

Object.assignのパフォーマンス

掲題の通り、Object.assignのパフォーマンスについて計測してみました。

Object.assignとは

ECMAScript2015の仕様書
ECMAScript 2015 Language Specification – ECMA-262 6th Edition

mixinメソッド。
ソースオブジェクトから列挙可能かつ直接所有のプロパティをターゲットオブジェクトにコピーします。

Object.assign(target, ...sources)

target
 ターゲットオブジェクト
sources
 ソースオブジェクト
戻り値
 ターゲットオブジェクト

準備

github.com

パフォーマンス計測のときに使っているコードに記述していきます。
コンストラクタで使ったケースを想定します。

  1. ES6のclass形式で普通にconstructorを定義する
  2. Object.assignを使ってconstructor自身を示すthisオブジェクトとマージする。
'use strict';

const suite = require('./suite');

class Person1 {
  constructor(name, age, gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
}

class Person2 {
  constructor(name, age, gender) {
    Object.assign(this, {name, age, gender});
  }
}

suite.run([
  {
    description: 'Contructor#native',
    exec() {
      new Person1('Person', 20, '男性');
    }
  },
  {
    description: 'Constructor#assign',
    exec() {
      new Person2('Person', 20, '男性');
    }
  }
]);

結果

Contructor#native x 86,560,002 ops/sec ±1.72% (82 runs sampled)
Constructor#assign x 733,613 ops/sec ±1.06% (83 runs sampled)
Fastest is Contructor#native

何回かやってみましたが結果は上記とほぼ変わらずだったので、
本当にパフォーマンスが求められるときは前者で一つ一つプロパティ代入を書く。

管理画面など、そこまで求められない場合はObject.assignを使っても良さそうです。