私は Java プラットフォームにまったく興味がありません。64 ビット JRE の利点を得るためにコードを変更する必要があるかどうかを知りたいのですが。
それとも、「java -d64」で開始すると、ターボモードで実行されるようなものですか?
あなたの助けは大歓迎です
私の以前のバージョンは、誤りではありませんが、すぐに書きすぎて単純化したものでした。
32 ビットから 64 ビットに変更しても、アプリケーションの実行速度が自動的に向上するわけではありません。場合によっては逆になることがあります。「マイナス」側 JVM でメモリ ポインターの逆参照を行うと、32 ビットよりも 64 ビット ポインターの方が時間がかかる場合があります。16 GB ヒープの完全なガベージ コレクションと圧縮には、2 GB ヒープよりも時間がかかる可能性があります。
プラス面: 32 ビットのものよりも効果的な 64 ビットのプロセッサ命令があります。64 ビット JVM では、32 ビットで得られる 4 GB よりわずかに小さい 2^32 倍のヒープ サイズを使用できます。(その量の RAM を購入する余裕がある場合) 一部の JVM は、ヒープ サイズが 4 GB 未満の場合、圧縮された参照を使用できます。これにより、64 ビット逆参照の価格を支払う必要なく、64 ビット命令の利点が得られます。
優れた JVM を使用している場合は、ヒープ サイズに関係なく 64 ビットにしますが、ヒープが非常に大きい場合はパフォーマンスが低下する可能性があることに注意してください。
64 ビット JVM でアプリケーションのパフォーマンスが向上するとは思いませんか? どのように?
実際、64 ビット プロセッサは少し遅くなります。それらには、より複雑なデコード パイプラインがあります (32 ビット操作の後方サポート)。より多くのメモリ スループットが必要です (すべてのポインタは 2 倍のサイズですよね?)。64 ビット プロセッサ上にある唯一のものは、大量の RAM です。私たちが知っているように、サイズはスピードです。多くの RAM は、一部のアプリケーションのパフォーマンスを非常に向上させることができます (アプリケーションがそれを使用できる場合)。つまり、64 ビット — いいえ。大量の RAM — 間違いなくそうです。
もう 1 つ、64 ビット プロセッサの方が高速に実行できることがあります。64 ビット数値のアトミックな書き込み/読み取り。64ビットの数値(Javaでは長い)を扱う場合、64ビットプロセッサの方が優れています。これは、その種類の数値を扱うためのマシンCAS命令があるためです。
いいえ、何も変更する必要はありません。64 ビットを使用することに固有の利点はありません。実際、すべてのポインターが 32 ビットではなく 64 ビット幅になるため、プログラムのメモリが大きくなります。
唯一の利点は、コードで多くの「long」を使用する場合や、アプリが 4 GB を超えるメモリを必要とする場合など、64 ビットの計算を行う場合です。
コードが実行される JVM は同じように動作する必要があるため (整数は常に 32 ビット符号付きなど)、実行するプラットフォームに関係なく、コードは (理論的には) 同じように実行されることが保証されます。
32/64 ビットの違いは、JVM がランタイムを最適化する方法にあります。したがって、実行されたバイトコードは同じままですが、別の方法で最適化される (または最適化されない) 可能性があります。
簡単に言うと、Java を実行している 64 ビット システムは、同等の 32 ビット システムよりも高速にコードを実行する可能性があります。
何も変更する必要はありません。C や C++ とは異なり、Java には、使用しているプラットフォームに関係なく、int (およびその他のデータ型) が常に同じ長さであることを保証する仕様が書かれています。
アプリケーション コードに JNI はありますか? 次に、32 ビットと 64 ビットのネイティブ バイナリについて心配する必要があるかもしれません。
32 または 64 は、Java コードではすべて同じです。パフォーマンスの側面は、以前のポスターですでに十分にカバーされているようです。
はい、何も変更する必要はありません。異なるのは JRE であり、作成するコードではありません。
これを試して:
public class Benchmark {
public static void main(String args[]) {
long time = System.currentTimeMillis();
for (int a = 1; a < 900000000; a++) {
for (int b = 1; b < 20; b++) {
}
}
long time2 = System.currentTimeMillis() - time;
System.out.println("\nTime counter stopped: " + time2);
}
32 ビットと 64 ビットの違いを笑ってください。