Javascript プロトタイプ演算子のパフォーマンス: メモリを節約しますが、高速化されますか? 質問する

Javascript プロトタイプ演算子のパフォーマンス: メモリを節約しますが、高速化されますか? 質問する

私は読むこちら(ダグラス・クロックフォード)プロトタイプ演算子を使用して JavaScript クラスにメソッドを追加するメモリも節約

それから私は読んだジョン・レシグの記事 「プロトタイププロパティを多数持つ関数をインスタンス化することはとても、とても、速いしかし、彼はプロトタイプを標準的な方法で使用することについて話しているのでしょうか、それとも記事内の特定の例について話しているのでしょうか?

たとえば、次のオブジェクトを作成します。

function Class1()
{
   this.showMsg = function(string) { alert(string); }
}
var c = new Class1();
c.showMsg();

より遅いそれで、このオブジェクトを作成しますか?

function Class1() {}
Class1.prototype.showMsg = function(string) { alert(string); }
var c = new Class1();
c.showMsg();

追伸

プロトタイプは継承やシングルトン オブジェクトなどを作成するために使用されることは知っています。しかし、この質問はこれらの主題とはまったく関係がありません。


編集:興味があるかもしれない人JS オブジェクトと JS 静的オブジェクトのパフォーマンス比較読める下の回答静的オブジェクトは間違いなく高速です明らかに、オブジェクトのインスタンスが複数必要でない場合にのみ使用できます。

ベストアンサー1

2021年に編集:

classこの質問は、 が JS で利用できなかった2010 年に尋ねられました。今日ではclassは非常に最適化されているため、 を使用しないという言い訳はありません。 を使用する必要がある場合はnewを使用してくださいclass。しかし、2010 年当時は、メソッドをそのオブジェクト コンストラクターにバインドするときに 2 つのオプションがありました。1 つは、 を使用して関数コンストラクター内で関数をバインドすることでありthis、もう 1 つは を使用してコンストラクターの外で関数をバインドすることでしたprototype。@MarcoDemaio の質問には非常に簡潔な例があります。classが JS に追加されたとき、初期の実装はパフォーマンスが似ていましたが、通常は遅くなりました。これはもうまったく当てはまりません。 を使用してくださいclass。今日では を使用する理由は思いつきませんprototype


興味深い質問だったので、非常に簡単なテストをいくつか実行しました (メモリをクリアするためにブラウザを再起動する必要がありましたが、そうしませんでした。参考までに)。少なくとも Safari と Firefox では、大幅prototypeに高速化されているようです [編集: 前述の 20 倍ではありません]。完全な機能を備えたオブジェクトを使用した実際のテストの方が、比較に適していると思います。実行したコードは次のとおりです (テストは個別に複数回実行しました)。

var X,Y, x,y, i, intNow;

X = function() {};
X.prototype.message = function(s) { var mymessage = s + "";}
X.prototype.addition = function(i,j) { return (i *2 + j * 2) / 2; }

Y = function() {
  this.message = function(s) { var mymessage = s + "";}
  this.addition = function(i,j) { return (i *2 + j * 2) / 2; }
};


intNow = (new Date()).getTime();
for (i = 0; i < 10000000; i++) {
  y = new Y();
  y.message('hi');
  y.addition(i,2)
}
console.log((new Date()).getTime() - intNow); //FF=5206ms; Safari=1554

intNow = (new Date()).getTime();
for (i = 0; i < 10000000; i++) {
  x = new X();
  x.message('hi');
  x.addition(i,2)
}
console.log((new Date()).getTime() - intNow);//FF=3894ms;Safari=606

本当に残念ですprototype。 を使うのは本当に嫌いです。 オブジェクト コードは自己カプセル化されていて、逸脱しないようにしたいのです。 でも、速度が重要な場合は、選択の余地がないのでしょう。 残念。

[編集] 以前のコードが間違っていたことを指摘し、メソッドの報告された速度を大幅に向上させてくれた @Kevin に感謝します。prototype修正後もプロトタイプは大幅に高速化していますが、その差はそれほど大きくはありません。

おすすめ記事