Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8873

[Node.js][Deno] オブジェクト合成各種 ベンチマーク比較

$
0
0

先ほどの クラスのベンチマークの続編。
オブジェクト合成でより良い(というか速い)手法ないかなと悩みつつ。

実験環境

同じく

  • Node.js 14.15.1
  • Deno 1.5.4

実験設定

  • 10要素で構成されるオブジェクト2組を1つのオブジェクトにまとめる
  • 要素のうち5つは名前が重複しており、合成元を合成先に上書きする
  • 合成先はプロトタイプではなく、独立したオブジェクトとして新規に生成される

という前提で

  • 合成先オブジェクトを生成するファンクションと、合成元オブジェクトを用意
  • 実行時間計測
    • 合成先オブジェクト生成ファンクションだけの結果
    • 合成先オブジェクト生成ファンクション+各種アルゴリズムの結果
  • 結果表示
    • 各種アルゴリズムの結果部分を抽出表示

という手順。

オブジェクト合成アルゴリズム ここに集う

今回調査するアルゴリズムを御紹介いたしましょう。

assign
Object.assign()
spread
スプレッド構文
for
for inループ
forEach
keys forEachコールバック
map
keys mapコールバック
entries
entries列挙ループ
lowtech1
(対照用) オブジェクト要素として個別に代入
lowtech2
(対照用) 連想配列要素として個別に代入

多少のオーバーヘッドは仕方ないにしても、できるだけ対照用で挙げた方法に
近い(というか速い)アルゴリズムを採用したいという趣旨。

いざ、実験

今回は記述がコンパクトなので、1ソースでまとめていけます

bench_obj_merge.js
functionCreateParent(){return{a:0,b:1,c:2,d:3,e:4,f:5,g:6,h:7,i:8,j:9};}varsub={f:10,g:11,h:12,i:13,j:14,k:15,l:16,m:17,n:18,o:19};// 実行内容 varfunx={dmy:()=>0,// 最初の実行項目は不利な結果が出るのでダミー create:()=>CreateParent(),assign:()=>Object.assign(CreateParent(),sub),spread:()=>{return{...CreateParent(),...sub};},for:()=>{vart=CreateParent();for(varkinsub)t[k]=sub[k];returnt;},forEach:()=>{vart=CreateParent();Object.keys(sub).forEach(k=>t[k]=sub[k]);returnt;},map:()=>{vart=CreateParent();Object.keys(sub).map(k=>t[k]=sub[k]);returnt;},entries:()=>{vart=CreateParent();for(var[k,v]ofObject.entries(sub))t[k]=v;returnt;},lowtech1:()=>{vart=CreateParent();t.f=sub.f;t.g=sub.g;t.h=sub.h;t.i=sub.i;t.j=sub.j;t.k=sub.k;t.l=sub.l;t.m=sub.m;t.n=sub.n;t.o=sub.o;returnt;},lowtech2:()=>{vart=CreateParent();t['f']=sub['f'];t['g']=sub['g'];t['h']=sub['h'];t['i']=sub['i'];t['j']=sub['j'];t['k']=sub['k'];t['l']=sub['l'];t['m']=sub['m'];t['n']=sub['n'];t['o']=sub['o'];returnt;},};// 計測結果を書き込むところ varrec={};// 動作テスト //for(var k in funx)console.log([k,funx[k]()]);// 繰り返し実行時間計測 varloop=Array(1000000);for(varkinfunx){varf=funx[k];varbgn=newDate;for(variofloop)f();varend=newDate;rec[k]=(end-bgn);}// 結果表示 for(varkinrec)console.log(k+' :'+(rec[k]-rec.create));

ここで予想外の事態。当初は 前回と同じ1千万ループだったのですが、なかなか処理終わらなかったので一旦止めて桁減らしちゃいました。
それでループ回数が1桁減っているので、前回の結果と比べるときは御注意ください。

Node.jsDeno
assign255.7265.4
spread6906.36503.3
for289.2484.4
forEach413.6463.1
map445.5505.7
entries417.3428.4
lowtech110.18
lowtech210.38

まず目を疑ったのが、今(一部で)流行りのスプレッド構文、なんと1桁遅い。
記述が一番シンプルなだけに残念なところ。
で、とりあえず Object.assign() がベストというか幾分マシということで。
もっと素敵な手法ないものかしらん。


Viewing all articles
Browse latest Browse all 8873

Trending Articles