私は Web アプリを書き直しています。現在、API 全体が、すべてのオブジェクトの関数メンバーが特権メソッドになるように設計されています。概念を誤解していなければ、特権メソッドはオブジェクトのインスタンスごとにそれぞれのコピーがあるためメモリを浪費しますが、パブリック メソッドはすべてのインスタンスに対してコピーが 1 つしかないためメモリを節約します。ここまでは問題ありません。
ただし、私のアプリのほとんどのオブジェクトは (動的に作成された) DOM オブジェクトです。現在、多かれ少なかれ次のようになっています。
function DOMObj(parent,tag,x,y,w,h,...){
var obj = document.createElement(tag);
.
.
.
parent.appendChild(obj);
obj.Method1 = function(){/* some code */}
obj.Method2 = function(){/* some code */}
.
.
.
obj.MethodN = function(){/* some code */}
return obj;
}
.
.
.
txt = DOMObj(document.body,"div",...);
txt.innerHTML = "some text";
DOM 自体がオブジェクトの作成を処理するため、 new演算子を使用する必要はありませんが、メソッドを公開する場合は、次のように書き直す必要があります。
function DOMObj(parent,tag,x,y,w,h,...){
var obj = document.createElement(tag);
.
.
.
parent.appendChild(obj);
this.DOMObj = obj;
}
DOMObj.prototype = {
Method1: function(){/* some code */},
Method2: function(){/* some code */},
.
.
.
MethodN: function(){/* some code */}
}
.
.
.
txt = new DOMObj(document.body,"div",...);
txt.DOMObj.innerHTML = "some text";
この場合、新しいオブジェクトを作成するたびに、明らかにメモリ消費に影響を与えるnew演算子を使用する必要がありますが、どれくらい強いのでしょうか? そして最も重要なことは、私が節約するメモリの量と比較して、バランスが正か負か?
私はまた、小さなオーバーヘッドを追加します (あなたがそうするなら知覚できない)、私は誰かのブログを読んで、パブリックメソッドは特権メソッドと比較してパフォーマンスにプラスの影響を与えたと述べましたが、彼は想定される理由を説明せず、サポートする数値も示しませんでした彼の主張なので、この主張は本当ですか?そうである場合、このゲインは、追加するオーバーヘッドによって無効になりますか? または私はまだ得ていますか?もしそうなら、少なくとも最も遅いスマートフォンでは悪名高いでしょうか?
明らかに、この質問に対する答えは、作成されたオブジェクトの数、メソッドの数、および Javascript エンジンの内部構造に依存します。とてつもない影響力を持っていますが、これはあまり賢くは見えず、「どれだけ大きいか」という核心的な質問にもつながります。言い換えれば、このような変更がアプリのパフォーマンスに与える影響を正確に計算するにはどうすればよいでしょうか? 、そもそもそのような計算を実行するために必要な情報はどこかにありますか? 少なくとも、このような変更が努力する価値があるかどうかを知る必要があります (いくつかの信頼できる数字に基づいて)。
V8 やその他の JavaScript エンジンの内部の経験をお持ちの方は、これに光を当てることができますか?.