3

次のJavascript関数(1)について考えてみます。

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

この関数について私が気に入らないのは、関数が呼び出されるたびにまったく同じオブジェクトが作成されることです。オブジェクトは変更されないので、一度だけ作成したいと思います。したがって、次の調整を行うことができます(2)。

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

これで、スクリプトがロードされてに格納されるときに、オブジェクトが1回作成されdataObjectます。setDataしかし、それがたまにしか呼び出されないと仮定しましょう。ほとんどの場合、スクリプトがロードされると、関数は使用されません。その場合のこの関数について私が気に入らないのは、オブジェクトが常に作成されてメモリに保持されることです。これには、オブジェクトが使用されない場合も含まれます。私はあなたが理想的なバランスをとるためにこのようなことをすることができると思いました(3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

それは理にかなっていますか?インタプリタがいつオブジェクトを作成するかによって決まると思います。それは本当に条件を通過するまで待つの!dataObjectでしょうか、それとも関数に入り、賢くなり、事前に構築することを決定するのでしょうか?おそらく、Javascriptエンジンが異なれば、これに関してポリシーも異なりますか?

そしてもちろん、これらの最適化が実際に重要になるかどうかという問題があります。明らかに、これはオブジェクトのサイズ、エンジンの速度、利用可能なリソースの量などの要因に依存します。しかし、一般的に、どちらがより重要な最適化であると言えますか:(1)から(2)または(2)から(3)へ?

4

5 に答える 5

2

答えは、あなたが知っているはずがないということです。あなたが示した例は、それらの間でほとんど違いがありません。これについて合理的に心配する唯一の方法は、何らかの方法で特定のインタプリタのパフォーマンスまたはメモリ使用量に著しく悪影響を及ぼしているという実際の証拠がある場合です。それまでは、そのことを心配するのは通訳の仕事です。

そうは言っても、本当に知りたいのなら...試してみてください。異なるバージョンを1,000,000回呼び出して、どのような違いが生じるかを確認します。

オブジェクトの巨大なバージョンを作成し、それがへこみを作るかどうかを確認します。タスクマネージャーを監視します。別のブラウザを試してください。結果を報告してください。インターネット上でたくさんのジャークに何が起こっているのかを尋ねるよりも、それを見つけるのにはるかに良い方法です。

ソーステキストとして...に関係なく、オブジェクトはとにかくメモリ内にある必要があることに注意してください

于 2009-08-12T03:31:40.797 に答える
2

新しいオブジェクトを作成する必要があります。仕様で要求されているため、作成することはできませんが、ほとんどの場合、代替の動作は直感に反するため、次のようにします。

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

新しいオブジェクト式が、要求しているオブジェクトを実際に生成しないことを本当に期待していますか?それがあなたが望んでいるように見えるからです。

おそらくあなたはただやりたいだけです:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

返されるオブジェクトは変更可能な完全に変更可能なオブジェクトであり、全員が同じ変更インスタンスを共有していることを理解する必要がありますが、どちらでも目的の効果が得られます。

于 2009-08-12T06:39:15.957 に答える
1

まず、状況2で実装し、ページが読み込まれた直後に1回読み込みます。

ページ速度に問題がある場合は、ページ内の特定のタスクにかかる時間を測定します。

オブジェクトを作成するのに非常に費用がかかる場合(比較的言えば)、状況#3に移ります。

本当に何も買わないのであれば、「if」ステートメントを追加しても意味がありません...この場合、単純な/大きなオブジェクトを作成しても、CPUの負担になりません。測定がなければ、最適化することはできません。ブラインドで撮影しているだけです。

これは実際、私がC++やJavaで個人的に使用したものを初期化するためのかなり一般的な方法です。

于 2009-08-12T03:05:54.373 に答える
1

まず、この最適化は実際には重要ではありません。

第二に、最後の関数は最初の関数とまったく同じです。よくほとんど。最初は、ガベージコレクターに翻弄されていると思います。ガベージコレクターは、を再割り当てすると古いオブジェクトを破棄するはずですdomElement.myDataProperty。それでも、ガベージコレクターがターゲットプラットフォームでどのように機能するかを正確に知らなければ(ブラウザーによって大きく異なる可能性があります)、実際に作業を保存していることを確認することはできません。

于 2009-08-12T03:11:02.883 に答える
1

いくつかのブラウザで3つすべてを試して、どちらが速いかを調べてください。

于 2009-08-12T15:47:57.720 に答える