1

ファイル処理を実装するオブジェクトの内部にあるとします。私は読みやすくするためにコードを書いています。それは難しいことができるコードの最新のJavaScript/ECMAScripteコンパイラは、関数呼び出しから値を返す際に不要な変数代入を最適化しますか?

例がある場合は特に、戻り値の型を指示する複数のネストされた関数呼び出し:

function create() { 
    var fileHandle = doCreateAction(); 
    return fileHandle; 
} 

function create() { 
    return doCreateAction(); 
} 

この例では、明確化変数を導入することで、より読みやすいです

理論的には、コンパイラはdoCreateAction()の結果を一時的に(おそらくhiddenM、匿名、一時的な一時変数の中に)格納する必要があるため、2番目のバージョンは同じように動作します。このコードは、名前付き変数に割り当てるときに遅くなりますか?

+1

"名前付き変数に割り当てるときに、このコードの実行速度が低下しますか?"あなた自身でいくつかのベンチマークをやろうとしましたか?オフトピック。私はあなたの関数の名前を変更するほうがいいと思います:)なぜ 'doCreateAction'は' fileHandle'と記述した方が良いのでしょうか?なぜあなたは 'createFileHandle'か何かと呼ばないのですか? –

+1

そのような明らかに明白なケースでは?彼らがそうしなければ、私は本当に大喜びだろう。私はそれが事実であることを知っていますか?いいえ、私はすべての主要なJavaScriptエンジンのオプティマイザ・コードを検証していません(V8では、現在、インタープリタとコンパイラの両方を使用していますが、最近は2つのコンパイラを使用していました)。 –

+0

あなたはこれを知りたいのです...なぜですか? –

答えて

1

私は変数を最適化するか、気にする価値がないと言います。いずれの場合も、魚を揚げるためにはより大きな魚があることになります。 :-)しかし、これにはテールコールに関して面白い側面があります。

ただし、最初は単純なパフォーマンスの点で:this simplistic, synthetic testは、変数があるかどうかによってパフォーマンスが変わらないことを示しています。まともなミニライターを使用している場合は、JavaScriptエンジンが検索される前に、ミニ変数がその変数を削除する可能性が高いことにも注意してください。

テールコールへの移行:厳密なモードのES2015では、指定にテールコール最適化が必要です。つまり、関数AがBを呼び出すのではなく関数Bを呼び出した結果を返すときその結果をAに返し、それを呼び出し元に返し、Aは制御をBに直接渡し、呼び出し元に結果を返します。これは、いくつかの点でより効率的です(スタック上に別のフレームを作成するのを避け、ジャンプを回避します)。

JavaScriptエンジンは、引き続きTCOの実装に取り​​組んでいます。しかし、read the specが正しく(ノーフィートフィーなし)あれば、最初の例は末尾にdoCreateActionとなるので、TCOで最適化できますが、2番目の例では最適化できません。現在、ノード8.2.1(v5.8.283.41)のV8のTCOは、実際には2番目ではなく1番目を最適化します。

これは、エンジンが指定されたTCOを実装した時点で、このような場合に仕様を超えているかどうかによって、実際にはテールコールとなることがあります。


私は、その状況でデバッグの目的で変数を使用することについてかなり厳密でした。 Chromeのdevtoolsの中程度のバージョンではのためにはの目的は必要ありません(とにかく、それはとにかく削除されます)。returnに入ると、変数のローカルスコープリストに戻り値が表示されます。もちろん、これはChromeのdevtoolsを使用している場合にのみ便利です(Firefoxの場合など、これはまだしていません)。

関連する問題