web-dev-qa-db-ja.com

C ++またはJava=大量のRAMを必要とするアプリケーションでは?

私は、ほとんどがプロセッサに依存し、ヒープ使用量が多い(少なくとも数ギガバイト)科学アプリケーションを考えています。それ以外の時期はC++で楽しく過ごすでしょうが、この場合、C++メモリマネージャーに固有の断片化は、Javaのコンパクトコレクターの利点と比較して深刻な問題になるのではないかと思います。

これに関連する実際の例を誰かが指摘できますか?

11
dsign

マシンの制限stressにバインドされているアプリケーションについて話している場合は、それらを超えないようにするためのプログラミングトリックを行うことを期待します。限界、そしてC++は行く方法です。 C++は、Javaにはない(Emilioが指摘したように)最適化の余地を与えるだけでなく、ガベージコレクターは非常にメモリを大量に消費するため、大量の空きメモリを必要とします。効率的に作業します。

この質問への答え: StackOverflow:ガベージコレクションに必要な追加のメモリ量 ?かなり悲惨な絵を描きますが、ガベージコレクターは、割り当てられたメモリと同じくらいだけの空きメモリが必要な場合でも(これは私が持っていたものです)聞いた)、これはJavaを使用しても、効率的に実行するためにはまだ多くの空きメモリが必要であることを意味します。

一方、今日では、ハードウェアの制限を超えないようにするためにプログラミングのトリックを実行する必要があるよりも、一般的にはより高価なハードウェアを購入することを好みます。あなたの場合、あなたのRAM問題は通常64ビットのマシンを使用して、必要なだけ多くのRAMモジュールをそのマシンにスローすることで解決されます。ハードウェアのコストは、最近の先進国の開発時間のコストにほど遠いものです。

このオプションを真剣に検討する必要があると思います。可能であれば、このオプションとJavaを使用してください。Java C++よりも、そしてそれを後で維持し続けるために。

11
Mike Nakis

JavaおよびC++であるため、Javaを使用していないため、問題はC++を使用していません。C++コンテナは通常、過剰な断片化を避けるために実装されています。 Java無料ストアのように。

ただし、メモリを直接割り当てる場合は、Javaで許可されていないため、断片化が発生する可能性があります。

適切なソリューション(C++の場合)は、固定された「プレックス」によって割り当てを管理するアロケータークラスを介してコンテナーとスマートポインターを使用することです(ここで重要な点は、適切なアロケータークラスを作成することです)。そして、これはJavaとは何の関係もないプログラミングスタイルなので、比較しても意味がありません。

[編集]これは古いサンプルである可能性があります: 固定割り当て

7

ガベージコレクションの利点は、メモリが無限にあるマシンをシミュレートすることです。その抽象化のメカニズムまたは実装は、プログラマーとして完全に透過的であるように意図されています。メカニズムがプログラムで使用されなくなったメモリを再利用していることは誰もが知っていますが、実際には保証されていません。 RAMプログラムが実際に使用するよりも多いマシンでプログラムを実行する場合、ガベージコレクションは決して発生しない可能性があります。繰り返しますが、方法に関係なくプログラムを作成することができるため、関係ありません。メモリを使用します。メモリマネージャは、プログラムが要求するたびに、より多くのRAMを割り当てるだけであり、そのような割り当ては常に成功すると仮定することができます。Javaガベージコレクションされた言語ですが、C++はそうではありません。1

ガベージコレクションの欠点は、 すべての抽象化と同様に であり、リークが発生しやすいことです。特にEdgeのケースでは、常に完全に機能するとは限らず、バグに遭遇する可能性があります。最も一般的なケース用に最適化されたガベージコレクションアルゴリズム(プログラマーとして透過的であるはずのアルゴリズム)を作成した人々、そして一般的なケースの問題は、それほど一般的ではないということです。 一般的に、ガベージコレクターがメモリの管理でできる以上のことはできません。しかし特定の状況(および十分な時間、エネルギー、および理解があれば)、それは可能かもしれません。 C++はこの柔軟性を提供します。 Javaはしません。

そうは言っても、ここでは言語を選択するための標準的なアドバイスが当てはまると思います。おそらく、この場合は制約があるため、なおさらそうです。 プロジェクトの主要な開発者に最も馴染みのある言語を選択してください。明らかな理由に加えて(開発できるようになるなど)アプリはより速く、より効率的です)、これは特にを記述している場合に重要です。プログラミングしているようにC++をプログラミングしているJavaは、メモリの効率が著しく低下するためです。同様に、C++でプログラミングしているようなJavaでのプログラミングは、あまり効果がなく、最終的にはガベージコレクションアルゴリズムが調整され、最も一般的なケースに合わせて調整されているため、最適化されたプログラム。

ガベージコレクション言語での作業に慣れているプログラマーは、ガベージコレクターと闘うのではなく、ガベージコレクターを信頼することを学びます。ガベージコレクションされた言語で作業している場合、これらはプロジェクトで必要なプログラマです。ガベージコレクション言語での作業に慣れているnotであるプログラマーは、そのような「無限のメモリ」の抽象化に本質的に懐疑的であり、多くの正当な理由があります。これらのプログラマーは優れているかもしれませんが、ガベージコレクションされた言語で作業したいものではありません。GCとのあらゆる段階で戦い、絶えず2番目に推測し、低速でメモリ効率が悪いことが多いためです。他のタイプのプログラマーよりもコード。せいぜい、彼らはホイールの再発明に多くの時間を費やすだけで、多くのお金がかかり、さらに長期のメンテナンスコストもかかります。

そして、それが本当に重要かどうかも自問する必要があります。ボー氏のコメントには真実のヒント以上のものがあります。メモリは現在とても安いので、手で書くだけの価値はほとんどありません。 massive量が必要な場合でも、それらの量は10年前ほど大きくはありません。プログラマーとアプリケーション開発はfar RAMのゴブと処理能力を購入するよりも高価です。それは、可能な限り経済を避けるべきだという意味ではありませんが、また、それを行うのに時間を無駄にしてはいけません。


1もちろん、この仮定は問題のより深い欠陥を浮き彫りにします。結局のところ、「JavaまたはC++」はちょっとしたニシンです。標準Java実装はガベージコレクションを提供し、C++は言語標準に準拠していませんが、C++にサードパーティのガベージコレクターを使用できなかった理由はまったくありません。多くの企業がこれらのものを売って生計を立てており、おそらく無料でそれらを配って生計を立てている人もいるでしょう。

2
Cody Gray