2

I am writing a code that solves equations for users. The user will be able to enter matrices, vectors and such. Right now, as I solve those equations, I write the solution to a table with each row representing any given variable or equation. The javascript object that was used to hold the equation during calculation is destroyed. I did this on purpose to prevent large arrays of data being stored in memory and potentially slowing down the script. As an array is needed later, it is read into an object from the appropriate table row.

このようにDOMにメモリを保持することと、メモリ内のオブジェクトにメモリを保持することとの比較はどうでしょうか。これらをDOMではなくオブジェクトとしてメモリに保持することで、コードの実行が遅くなるリスクが高くなりますか?また、これらのオブジェクトにはコードの複数の部分からアクセスする必要があるため、これらはグローバルオブジェクトである必要があります。右?

4

2 に答える 2

4

一言で言えば、いいえ。

Web開発で一定しているルールが1つあります。それは、DOMが遅いということです。

DOM要素の選択、アクセス、反復、およびそれらのプロパティの読み取りと変更は、ブラウザーJSで実行できる最も遅い作業の1つです。一方、ネイティブJSオブジェクトの操作は非常に高速です。原則として、私は可能な限りDOMでの作業を避けます。

あなたは、メモリ使用量が少ないことはどういうわけかパフォーマンスの向上に等しいという(誤った)仮定をします。実際、メモリ使用量を増やすとアプリケーションのパフォーマンスが向上するのは、通常1 (ブラウザだけでなく)です。計算結果をメモリにキャッシュするという性質により、後でデータを再構築するためのプロセッサと時間のかかる必要性を回避できます。もちろん、メモリの使用とパフォーマンスの必要性のバランスをとる必要があります。

あなたの場合、私は間違いなく方程式オブジェクトをメモリに保持します。おそらく驚くほど少量のメモリを使用しています。たとえば、Chromeで1,000個の整数の配列を作成したところ、メモリプロファイラーから、使用されたのは40 kB未満であり、ほとんどすべてがオブジェクトのオーバーヘッドであると言われました。値自体は4kB– 1000 * 4バイト(32ビット)しかかかりませんでした。

オブジェクトを再生成するためにDOMを読み取るルーチンの実行には、おそらく数十から数百ミリ秒(複雑さによってはさらに悪い)かかると考える場合、特にオブジェクトを1回生成して保持しないのはなぜですか?コストはとても低いですか?

ただし、すべてのパフォーマンスの質問と同様に、本当の答えは、パフォーマンスのボトルネックが実際にどこにあるかを確認するために、アプリケーションのプロファイルを作成する必要があるということです。Chromeの[デベロッパーツール]の[プロファイル]タブを使用して、アプリの使用時にCPUプロファイル(時間の経過に伴うプロセッサ使用率を測定)とヒープスナップショット(メモリ使用量を瞬時に測定)を取得します。

1-これは、プログラムが大量のメモリを使用してページをスワップアウトする必要があるかどうかによって異なります。16 GBのRAMが一般的になっているデスクトップマシンでは、心配する必要はほとんどありません。ただし、リソースがより制限されているモバイルデバイスのメモリ使用量を監視することは依然として重要です。

于 2013-02-21T03:10:17.367 に答える
1

このようにDOMにメモリを保持することと、メモリ内のオブジェクトにメモリを保持することとの比較はどうでしょうか。

テストして確認してください。DOMはより多くのメモリを使用し、アクセスが非常に遅くなると思います。いずれにせよ、非常に多くのものを保存していない限り、メモリへの影響はおそらく最小限です。

これらをDOMではなくオブジェクトとしてメモリに保持することで、コードの実行が遅くなるリスクが高くなりますか?

私が期待する反対。DOMへのアクセスは非常に遅くなります。

また、これらのオブジェクトにはコードの複数の部分からアクセスする必要があるため、これらはグローバルオブジェクトである必要があります。右?

間違い。クロージャに参照を保持することも、すべてのオブジェクトを単一の配列またはオブジェクトに配置することもできます。いずれにせよ、グローバルオブジェクト自体は悪くはなく、乱雑であると見なされ、名前の衝突の可能性が高くなります。

于 2013-02-21T03:12:12.857 に答える