7

問題

ネット上で何も見つからなかったなんて信じられません。間違ったものを探しているのかもしれません...

おそらく違いはほとんどないか、まったくありませんが、できる限りコードを最適化しようとしているので、質問する価値があると感じています.

簡単に言えば、オブジェクト内でメソッドを定義して実行する方が、関数をグローバルに定義して実行するよりも高速に処理されるかどうかを知りたいのです。

このことを考慮:

(function($){  
    $.fn.test = function() {  
        // do something here
    };  
})(jQuery);

この:

function test(){
    // do something here
}

私の質問

上記のうちどれがより高速で、その理由は何ですか? 速度に違いがない場合、どちらを使用することをお勧めしますか?

前もって感謝します

更新 1

関連性があるかもしれないので、なぜ私がこの質問をしているのかを説明する必要があると思います. 私は長年にわたって書いてきたさまざまな機能を含むライブラリを持っています。それらの数が非常に多いため、jQuery オブジェクトを拡張した場合に高速に実行されるか、それともそのままにしておくかを知りたいですか?

4

3 に答える 3

7

理論的には、どれがより高速かを判断するために検索する必要があるオブジェクトの数を数えるだけです。変数はスコープ チェーンに対して解決されます。スクリプト エンジンは、最初に関数の実行コンテキストを検索し、次に外部コンテキストを検索し、最後にグローバル コンテキストを検索する必要があります。

プロパティの解決では、最初にスコープ チェーンでオブジェクトを見つけ、次にオブジェクトまたはその[[Prototype]]チェーンでプロパティを見つける必要があります。

しかし実際には、コンパイラーの最適化は、上記の単純化された分析が正しい場合と同じくらい頻繁に間違っていることを意味し、さまざまなケースでさまざまなブラウザーでさまざまな結果を提供します。

一般に、このような最適化はパフォーマンスのわずかな変化をもたらし、純粋にパフォーマンス上の理由で考慮されるべきではありません。アプリケーション アーキテクチャ、メンテナンスの容易さ、および論理的なグループ化に適したオブジェクトとメソッドを設計します。

于 2012-10-25T08:21:59.847 に答える
3

私は約 1 年前にこの調査を行いましたが、使用する方が高速であると言えますthis.test()

しかし、それはあなたが何を必要としているかによります。特定の「ウィジェット」用のオブジェクトのみを作成する場合は、不要な関数を jQuery に追加することはお勧めしません。

シンプルなオブジェクト指向の使い方:

function Car(name) {
    this.name = name;
}

Car.prototype.startEngine = function() {
    // Start the engine...
};

Car.prototype.drive = function() {
    this.startEngine();

    // Switch the lights, fasten your seatbelt...
};


// create a new car
var bmw = new Car('BMW');

// Drive the car
bmw.drive();

あなたが理解しなければならないもう1つのことは、環境です(私の言いたいことを理解していただければ幸いです)。変数と関数の新しいスペースを作成することをお勧めします。これにより、検索する変数/関数が多すぎなくなります。それをリストとして想像してみてください。リストが小さければ小さいほど、その中のものを見つけるのが速くなります。したがって、新しい「スペース」を作成します。

(function(){
    // Your fresh space.
})();

JavaScript は「ローカル」空間で検索を試み、次にグローバル空間で検索を試みます。次のように想像してください。

|- global
     |- function aaa
     |- function bbb
     |- var myName
     |- your local space
           |- function ccc
           |- function aaa  It will not overwrite global function with the same name
           |- var someVariable

ご覧のとおり、「ローカル空間」にはアイテムが 3 つしかないため、物を見つけるのが速くなります。

ローカルの「スペース」でセミグローバル関数を呼び出す方が高速です。また、オブジェクト指向のことをしたい場合は、「オブジェクト」を拡張する方が適切で高速です。

UPDATE 関数ライブラリを整理したい場合は、それらをオブジェクト内にグループ化できます。遅くなるとは思いません。

var lib = {
    foo: function() {},
    bar: function() {},
    test: function() {}
};

lib.test();
于 2012-10-25T08:21:29.470 に答える
2

2 つのアプローチのどちらがより高速かを知りたい場合、最良の方法はそれらをプロファイリングすることです。これにより、一般的な概念ではなく、コードに関連する結果が得られます。

私の意見では、速度のために最適化するのではなく、API の保守性と豊富さのために最適化する必要があります。ご質問から

function test(){
    // do something here
}

常に悪いグローバルスコープにあります。理想的には、これらのメソッドを名前空間に配置する必要があり、質問のサンプル 1 は jQuery 名前空間の一部としてそれを行います。

于 2012-10-25T08:23:18.570 に答える