0

私の主な質問は次のとおりです。

頻繁にアクセスされる関数 (オブジェクトを返す) があり、人々に操作してもらいたい場合、情報の隠蔽によってパフォーマンス (CPU/メモリの両方) が損なわれますか?

または、特にnode.js(long running process)のようなプラットフォームを使用する場合、これはマイクロ最適化と見なされます。情報隠蔽よりもパフォーマンスを考慮する必要がありますか?


情報隠蔽に関する Douglas Crockford の記事を読んで 、プライベート メンバーと特権メソッドを追加できることを知りました。しかし、Douglas Crockford のこの引用によると、プロトタイプ メカニズムはメモリの節約に役立ちます。

メンバーが検索され、オブジェクト自体に見つからない場合は、オブジェクトのコンストラクターのプロトタイプ メンバーから取得されます。継承にはプロトタイプメカニズムが使用されます。また、メモリを節約します。

メモリのみが節約される場合、メモリは秒単位で安くなるため、これはそれほど大きな問題ではないかもしれません。しかし、John Resig のこの記事によると、多くのプロパティをプロトタイプ チェーンに追加する方が高速です (CPU)。

したがって、頻繁にアクセスされる (オブジェクトを返す) 関数があり、ユーザーに操作してもらいたい場合は、オブジェクトのプロパティをプロトタイプ チェーンに入れてインスタンス化することをお勧めします。

一連のプロトタイプ プロパティを使用して関数をインスタンス化するのは、非常に高速です。モジュールパターンなどを完全に水から吹き飛ばします。したがって、頻繁にアクセスされる (オブジェクトを返す) 関数があり、ユーザーに操作してもらいたい場合は、オブジェクトのプロパティをプロトタイプ チェーンに入れてインスタンス化することをお勧めします。

// Very fast
function User(){}
User.prototype = { /* Lots of properties ... */ };
// Very slow
function User(){
  return { /* Lots of properties */ };
}

CPU はかなり高速になっているため (ムーアの法則)、これもそれほど大きな問題ではないかもしれません。さらに、Javascript エンジンはパフォーマンスに関して信じられないほどの進歩を遂げたので、これを検討するべきか、それとも単に情報隠蔽を使用するべきなのか疑問に思っています。


私はまた、私が推測するこのサブ質問を持っています:

node.js などのプラットフォームを使用してメモリと CPU の両方を効果的に測定するにはどうすればよいでしょうか?

4

1 に答える 1

2

これは確かに、あなたがめったに最適化を必要としない何かを過度に最適化しようとしているように私には聞こえます。コストを最初に信頼できるものにし、次に自分や他の人が保守できるようにし、次に最適化が必要であるという証拠を得た後、本当に最適化が必要なものだけを最適化します。

まず、物事を真にプライベートにすることは複雑さを増します。本当にプライバシーが必要でない限り、メンバー変数を使用する必要があります。

第二に、プライバシーを実装するためのクロージャは、ある種のメモリ消費コストを伴います。使用ごとのメモリ量は少ないため、プライバシーが本当に必要な場合(最初のポイント)、これらのクロージャがたくさんない限り、追加の消費に気付くことさえないでしょう。

第3に、これらのオブジェクトが多数(たとえば数千)あり、メモリ消費が実際に重要な問題であると思われる場合は、いくつかの一般的なブラウザ(1つのバージョンでプライベートクロージャとパブリックメンバー変数がより単純なもの)を使用して、どの程度の違いがあるかを確認します。違いは実装固有であるため、ブラウザごとに大幅に異なる可能性があります。

これらの測定結果に基づいて、どちらに進むかを決めることができます。

これらのオブジェクトが何千もない場合は、目的を達成するために可能な限り簡単な方法でコードを記述し、アプリの実行後にそれらが本当に重要であることを示すことに時間を費やしてください。

于 2012-07-16T03:47:17.977 に答える