10

これは特にあいまいな点のように思えるかもしれませんが、私はJavascript言語全体の基礎を改善しようとしています(より具体的には、その最良かつ最も効率的な方法)。

http://jsperf.com/で理論をテストしているときに、奇妙な結果が出ました。

次のように定義された2つの「同一の」プロトタイプがあるとします。

Object1

var Object1 = function() {}

Object1.prototype.defaults = {
    radius: 400,
    up: 1
}

Object1.prototype.centerOffset = function() {
    return this.defaults.radius*this.defaults.up;
}

Object2

var Object2 = function() {}

Object2.prototype = {
    defaults: {
        radius: 400,
        up: 1
    },

    centerOffset: function() {
        return this.defaults.radius*this.defaults.up;
    }
}

Object1は、次の単純な操作を実行するときに、Object2よりも一貫した(限界の場合:〜3%)速度の利点があります。

var o = new Object1();
var offset = o.centerOffset();

var o = new Object2();
var offset = o.centerOffset();

ここで自分でテストを実行できます。OSX10.6.8でChrome25を使用しています。

私が知りたいのはこれです:

  • このパフォーマンスの違いの理由は何ですか?
  • このパフォーマンスは、JavaScriptのベストプラクティスを示していますか?

よろしくお願いします。

編集:回答に感謝します-一部の人が言及しているように、私の側でさらにテストすると、この問題はブラウザ(またはJavascriptコンパイラ固有)であることが示唆されているようです。Safari、IE 10、Firefoxでさらにテストしました。IE 10とFirefoxはどちらも、違いがないほど近い結果を出しました。Safariは、Object2での操作をObject1での操作よりもわずかに速く実行しました(平均で約2%)。ただし、その場合のパフォーマンスの違いはかなり大きいように見えるので、外れ値(その他)が何であるかを知りたいと思います。

4

2 に答える 2

3

関数を宣言すると、そのプロトタイプ属性がデフォルトのコンストラクターを含むオブジェクトで初期化されます。

Object1 では、既存のプロトタイプ関数に属性を追加しています。Object2 では、既存のプロトタイプを独自のコンストラクターのないものに置き換えています。

この 2 つは同一ではありません。

なぜ速度が違うのですか?インスタンスを作成するたびに、V8 が object2 プロトタイプにコンストラクター関数を追加している可能性があります。

または、既存のプロトタイプ関数が機械語で実装されて高速化されている可能性が高く、独自のオブジェクトを Object2.prototype に割り当てると、プロトタイプ関数は純粋な JavaScript になり、低速になります。

詳細はそれほど重要ではありません。異なるインタープリターがこれを異なる方法で処理するためです。重要なのは、Object1 と Object2 が完全に同一ではないことを認識することです。

于 2013-03-02T20:07:55.507 に答える
0

Object1内にプロトタイプを追加し、Object2内でそれを上書きすることと関係があると思います。確認するために、2番目のパフォーマンス例を作成しました:http://jsperf.com/correct-way-to-declare-prototype-functions/2

そこで、関数が割り当てられる前に「Object1.prototype={}」を追加しました。パフォーマンスは、Object1とObject2の両方でほぼ同じになりました(少なくともクロムでは)。

于 2013-03-02T19:55:06.007 に答える