3

バックグラウンド

私はよくモジュール パターンを使用してコードを整理し、関数と定数が必要に応じて動作するようにします。CONSTANTまたはsomeFuncが のみで使用される場合、 前者の 2 つがグローバル スコープを汚染しないように、 の定義を無名関数でanotherFunc囲みます。anotherFuncこれにより、名前の競合を回避でき、コードを後で確認して、何が何に依存しているかを確認できます。

ただし、この戦略は多くのクロージャーを作成します。これらの依存関係を明示的に渡す方がパフォーマンスが向上するかどうか (および保守性も向上するかどうか) を考えています。これには、変数を見つけるために関数がたどらなければならないスコープ チェーンを最小限に抑える効果があると思います。

モジュール パターン自体に関するフィードバックを許可するために、3 つのバージョンを含めました。1) モジュール パターンなし、2) モジュール パターンあり、3) モジュール パターンあり、スコープ チェーンの最小化。

モジュールパターンなし

var SHARED_CONSTANT;
var SOME_CONSTANT = 5;
var INNER_CONSTANT = {};
var inner = function(y) {
    return y !== {};
};
var outer = function g (x) {
    doSomething();
    $(...).load(inner);
};

モジュール パターンあり、スコープ チェーンの最小化なし

var SHARED_CONSTANT;
var outer = (function() {
    var SOME_CONSTANT = 5;
    var inner = (function() {
        var INNER_CONSTANT = {};
        return function /* inner */ (y) {
            return y !== {};
        };
    }());
    return function /* outer */ (x) {
        doSomething();
        $(...).load(inner);
    };
}());

モジュール パターンとスコープ チェーンの最小化を使用

var SHARED_CONSTANT;
var outer = (function($, SHARED_CONSTANT) {
    var SOME_CONSTANT = 5;
    var inner = (function(SOME_CONSTANT, SHARED_CONSTANT) {
        var INNER_CONSTANT = {};
        return function /* inner */ (y) {
            return y !== {};
        };
    }(SOME_CONSTANT, SHARED_CONSTANT));
    return function /* outer */ (x) {
        doSomething();
        $(...).load(inner);
    };
}(jQuery, SHARED_CONSTANT));

概要

パフォーマンスが向上するバージョン (およびその理由) は? パフォーマンスの違いは重要ですか?(つまり、スコープ チェーンのルックアップは高価ですか?) メモリ使用量はどうですか? (つまり、変数を渡すことで、本質的にスコープを複製していますよね?)

4

1 に答える 1

1

これらのパフォーマンス テストは、私が提案したことを裏付けているようです。これは時期尚早の最適化です。

テストでは、明確なお気に入りは示されません。どのブラウザーでも、3 つのスニペットは互いに近くにあり、最速のスニペットは、私が実行したほとんどの時間で変化します。一部の実行では、過度に最適化されたコードがさらに遅くなります。

JIT の最適化が原因である可能性があります。

学ぶべきこと:コードをできるだけ読みやすくし、ボトルネックがあることがわかっている場合は最適化について心配してください。

于 2015-01-22T23:22:57.040 に答える