大量のRAMを必要とするアプリケーションにC ++またはJavaを選択しますか?[閉まっている]


11

私は、主にプロセッサに依存し、ヒープ使用量が重い(少なくとも数ギガバイト)科学アプリケーションを考えています。1年のどの時期でもC ++を喜んで使用しますが、この場合、C ++メモリマネージャーにとって自然な断片化がJavaの圧縮コレクターの利点と比較して重大な問題になるのではないかと思います。

誰もこれに関連する実世界の例を指すことができますか?


この場合、言語はプログラミングほど重要ではないと思います。成熟した言語であれば、計算の規模によってはおそらく動作する可能性があります。Java、C / C ++、さらにはPythonやRubieでさえ、この役割に滑り込むことができます。メモリをリークしていないという確固たる保証を本当に必要としているように聞こえるので、他の人より難しい人もいます。
リグ

2
GBを7.99ドルで入手できる場合、それは問題ですか?キングストン1 GB DDR3
ボーパーソン

2
@BoPersson、私の経験では、この種の問題を抱えている人は、ハイエンドのマザーボードを完全に実装し、そこに好きなだけ置くことができないと不平を言ってから、管理可能な大きさのデータをフィードし、十分ではありません。
AProgrammer

@dsign、最近ではマザーボードが1000ユーロ未満で数百ギガのメモリを受け入れることができるので、いくつかのギグはメモリ使用量が多くありません。
AProgrammer

1
安価なメモリの部分に同意します。開発に関しては、私はしばらくの間C ++を使用していましたが、優れたコーディング慣行により、リークは比較的まれな現象になりました。実際のところ、私はその点でjavaよりもC ++の方が本当に好きです。
12

回答:


11

マシンの制限にストレスをかけるようなアプリケーションについて話している場合、これらの制限を超えないようにするためにプログラミングのトリックを行うと予想される場合、C ++が最適です。C ++は(Emilioが指摘したように)Javaにはない最適化の余地を与えるだけでなく、Garbage-Collectorは非常にメモリを大量に消費する仕掛けであり、効率的に動作するために十分な空きメモリが必要です。

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

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

このオプションを真剣に検討する必要があると思います。可能であれば、このオプションとC ++の代わりにJavaを使用してください。なぜなら、C ++よりもJavaで何かを開発する方がずっと簡単だからです。


ご回答有難うございます。ハードウェアの図に同意します。
12

ガベージコレクションの実行中にプログラムを一時停止する必要がない場合、メモリの必要量ははるかに少なくなります。

1
最後の段落には同意しません。Javaは、C ++よりも開発が必ずしも容易ではありません。私は過去5、6年で多くのC ++と比較的少ないJavaを行ってきたので、私には向かないでしょう。C ++とJavaの両方で、保守可能なコードと保守できないコードを書くことができます。
デビッドソーンリー

1
@DavidThornley私は10年以上C / C ++を、6年以上Javaをやってきました。プロトタイプ作成、開発、拡張、保守など、Javaはすべての点で簡単だと感じています。しかし、いずれにせよ、それは意見がすることを意味するものです:異なる。C-:=
マイクナキス

プロセッサを大量に消費するビッグデータプロジェクト用にプログラミングした人はいますか?コメントはありますか?
12

7

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

ただし、メモリを直接割り当てると、Javaで許可されていないこともできるため、フラグメンテーションが発生する可能性があります。

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

[編集]これは時代遅れのサンプルになる可能性があります: 固定割り当て


エミリオさん、ご回答ありがとうございます。私はC ++の柔軟性を十分に認識しており、あなたに同意する傾向があります。繰り返しになりますが、これらの手法が成功するために使用されている実際の使用例について知りたいと思います。
12

@dsign:投稿の編集、リンクを参照
エミリオ

1
以前にこれらの手法を使用しました。パフォーマンスの低いアプリでは、固定ブロックヒープのセットを使用するようにアロケーターが変更されました。したがって、4バイトブロックが必要な場合は、4バイトブロックのみを格納するヒープから取得されます。5バイトが必要な場合は、8バイトのブロックヒープなどが原因でした。パフォーマンスの向上(アプリの割り当てが多いため)は非常に大きかったです。良い結果が得られないかもしれませんが、非常に効果的です。また、すべてのallocが固定ブロックになっているため、断片化はありませんでした。
gbjbaanb

2

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

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

それはすべて、言語を選択するための標準的なアドバイスがここに当てはまると思います。おそらく、この場合、制約が与えられればなおさらです。プロジェクトの主要な開発者に最も馴染みのある言語を選択してください。明白な理由(アプリをより速く、より効率的に開発できるようになるなど)に加えて、これは特にJavaをプログラミングしているようにC ++をプログラミングすると、メモリ管理が非常に非効率的になり、リークやクラッシュが発生するため、説明する場合に重要です。同様に、C ++でプログラミングしているようなJavaでのプログラミングはあまり役に立たず、ガベージコレクションアルゴリズムが微調整されて最も一般的なケースに合わせて調整されているため、最適化されていないプログラムを生成する可能性があります。

ガベージコレクション言語での作業に慣れているプログラマーは、ガベージコレクターと戦うのではなく、ガベージコレクターを信頼することを学びます。ガベージコレクションされた言語で作業している場合、これらはプロジェクトで必要なプログラマです。そうでないプログラマーガベージコレクションされた言語での作業に慣れていたのは、本質的にそのような「無限のメモリ」抽象化に懐疑的であり、多くの理由があります。これらのプログラマは良いかもしれませんが、ガベージコレクション言語で作業したい人ではありません他のタイプのプログラマーよりコード。せいぜい、彼らは車輪の再発明に多くの時間を費やすだけで、あなたに多くのお金を費やし、さらに長期的なメンテナンス費用を払うでしょう。

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


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.