2

coffee-次の単純なコードスニペットのJSを生成しました。

console.log 'b' if 'b' in arr

var __indexOf = [].indexOf || function(item) {
    for (var i = 0, l = this.length; i < l; i++) {
        if (i in this && this[i] === item) return i;
    } return -1;
};

if (__indexOf.call(arr, 'b') >= 0) {
  console.log('b');
}

なぜそうなのか理解できます。IEはをサポートしていないためindexOf、CSコードがすべてのブラウザでスムーズに実行されるようにする必要があります。ただし、Node.jsサーバーのコードを作成するときは、JSエンジンが何をサポートしているかを正確に把握しているため( ECMA-262、第5版)、上記のトリックは必要ありません。

私はさまざまなJavaScript実装にあまり精通していませんがcoffee -c、ブラウザーの非互換性のために生成される非最適なコードはそれだけではないと確信しています。数千の同時接続がある本番サーバーでそれらすべてを考慮すると、コードへのかなりの不必要なオーバーヘッド。

これを改善する方法はありますか?最近、ますます多くのNode.jsコードがCSで記述されており、SourceMapが登場すれば、その数はさらに増えるでしょう...

4

1 に答える 1

3

これはほとんど最適ではありません。__indexOf宣言は最初に一度評価され、すぐに解決されます。[].indexOfつまり、基礎となる実装のを使用しArray.prototype.indexOfます。確かに、それは必ずしも莫大な費用ではありません。

「最適ではない」コードの他の例をいくつか見る必要がありますが、それらのほとんどは同じバスケットに分類されると確信しています。同時接続の数は、これの効果をまったくスケーリングしません。

于 2012-05-27T12:12:33.843 に答える