ガベージコレクションcould(理論的には)手動のメモリ管理よりも高速であることを、多くの場所で読みました(実際、自分で書いたこともあります)。
ただし、表示することは伝えることよりもはるかに困難です。
私は実際にseenこの効果を実際に示すコードをまったく使用していません。
誰かがこのパフォーマンスの利点を実証するコードを持っていますか(または私がどこで見つけることができるか知っていますか)?
http://blogs.msdn.com/b/ricom/archive/2005/05/10/416151.aspx を参照し、すべてのリンクをたどってRico MarianiとRaymond Chen(どちらも非常に有能です)を参照してくださいMicrosoftのプログラマー)と対決します。レイモンドは管理されていないものを改善し、リコは管理されているもので同じものを最適化することによって対応します。
本質的にゼロの最適化作業で、管理されたバージョンはマニュアルより何倍も速く開始されました。結局、マニュアルは管理されたものを上回ったが、ほとんどのプログラマーが行きたくないレベルに最適化することによってのみ。すべてのバージョンで、マニュアルのメモリ使用量はマネージドよりもはるかに優れていました。
目安として、無料のランチはありません。
GCは手動のメモリ管理の頭痛を取り除き、間違いを犯す可能性を減らします。特定のGC戦略が問題の最適な解決策である状況がいくつかあります。その場合、それを使用してもペナルティはありません。しかし、他のソリューションがより高速になる他のものがあります。常により低いレベルからより高い抽象化をシミュレートできますが、その逆はできませんので、一般的なケースではより高い抽象化がより低い抽象化よりも高速である可能性がないことを効果的に証明できます。
GCis手動メモリ管理の特殊なケース
手動でパフォーマンスを向上させるには、多くの作業が必要になるか、エラーが発生しやすくなりますが、それは別の話です。
GCが手動の方法よりもはるかに効率的であるという人為的な状況を構築するのは簡単です。ガベージコレクターには「ルート」が1つだけあり、すべてがガベージであるため、GCステップは即座に完了します。
考えてみれば、それはプロセスに割り当てられたメモリをガベージコレクションするときに使用されるモデルです。プロセスは死にます。記憶はすべてゴミです。これで完了です。実際には、トレースを残さずに開始、実行、停止するプロセスは、開始して永久に実行するプロセスよりも効率的です。
ガベージコレクションを使用する言語で記述された実用的なプログラムの場合、ガベージコレクションの利点は速度ではなく、正確さと単純さです。
GCは単なるメモリ管理戦略ではないことを考慮してください。また、言語およびランタイム環境の設計全体に要求を出し、コスト(および利益)を課します。たとえば、GCをサポートする言語は、ガベージコレクターからポインターを非表示にできないフォームにコンパイルする必要があり、一般に、慎重に管理されたシステムプリミティブ以外ではポインターを構築できません。もう1つの考慮事項は、GCが実行を完了するまで許可する必要があるいくつかのステップを課すため、応答時間の保証を維持することの難しさです。
したがって、ガベージコレクションされた言語を使用していて、同じシステムで手動で管理されたメモリと速度を比較する場合、使用していない場合でも、ガベージコレクションをサポートするためのオーバーヘッドを支払う必要があります。
速いのは怪しいです。ただし、ハードウェアがサポートしている場合は、超高速、感知できない、または高速になる可能性があります。ずっと前に、LISPマシンにはそのようなデザインがありました。 1つはハードウェアのメモリサブシステムにGCを組み込み、メインCPUがそれが存在することを認識しませんでした。その後の多くの設計と同様に、GCはメインプロセッサと同時に実行され、一時停止の必要はほとんどありませんでした。よりモダンな設計は、Azul Systems Vega 3マシンで、Javaコードは、JVMの専用プロセッサーと一時停止のないGCを使用した場合よりも高速に実行されます。GC(またはJava )することができます。
私はこれについてかなりの作業を行い、その一部について説明しました ここ 。私はC++でBoehm GCをベンチマークし、malloc
を使用して割り当てますが、free
を使用して解放、割り当て、および解放しません。また、C++で記述されたカスタムビルドのマーク領域GCと、リストを実行するOCamlのストックGCベースのn-クイーンソルバー。 OCamlのGCはすべてのケースで高速でした。 C++およびOCamlプログラムは、同じ割り当てを同じ順序で実行するように意図的に作成されています。
もちろん、プログラムを書き直して、64ビット整数のみを使用し、割り当てを使用せずに問題を解決することもできます。それはより速くなりますが、演習の要点を打破します(これは、C++でビルドされたプロトタイプを使用して作業していた新しいGCアルゴリズムのパフォーマンスを予測することでした)。
私は長年、業界で実際のC++コードをマネージ言語に移植してきました。ほとんどすべてのケースで、パフォーマンスの大幅な改善が見られましたが、その多くはおそらく手動メモリ管理のGCによるものでした。実際の制限は、マイクロベンチマークで達成できることではなく、締め切り前に達成できることであり、GCベースの言語は、私が振り返ることができなかったような大幅な生産性の向上を提供します。私はまだ組み込みデバイス(マイクロコントローラー)でCおよびC++を使用していますが、それでも今は変わりつつあります。