13

私は Java プラットフォームにまったく興味がありません。64 ビット JRE の利点を得るためにコードを変更する必要があるかどうかを知りたいのですが。

それとも、「java -d64」で開始すると、ターボモードで実行されるようなものですか?

あなたの助けは大歓迎です

4

9 に答える 9

13

私の以前のバージョンは、誤りではありませんが、すぐに書きすぎて単純化したものでした。

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 ビットにしますが、ヒープが非常に大きい場合はパフォーマンスが低下する可能性があることに注意してください。

于 2008-10-14T10:57:14.863 に答える
8

64 ビット JVM でアプリケーションのパフォーマンスが向上するとは思いませんか? どのように?

実際、64 ビット プロセッサは少し遅くなります。それらには、より複雑なデコード パイプラインがあります (32 ビット操作の後方サポート)。より多くのメモリ スループットが必要です (すべてのポインタは 2 倍のサイズですよね?)。64 ビット プロセッサ上にある唯一のものは、大量の RAM です。私たちが知っているように、サイズはスピードです。多くの RAM は、一部のアプリケーションのパフォーマンスを非常に向上させることができます (アプリケーションがそれを使用できる場合)。つまり、64 ビット — いいえ。大量の RAM — 間違いなくそうです。

もう 1 つ、64 ビット プロセッサの方が高速に実行できることがあります。64 ビット数値のアトミックな書き込み/読み取り。64ビットの数値(Javaでは長い)を扱う場合、64ビットプロセッサの方が優れています。これは、その種類の数値を扱うためのマシンCAS命令があるためです。

于 2009-07-24T11:46:24.023 に答える
7

いいえ、何も変更する必要はありません。64 ビットを使用することに固有の利点はありません。実際、すべてのポインターが 32 ビットではなく 64 ビット幅になるため、プログラムのメモリが大きくなります。

唯一の利点は、コードで多くの「long」を使用する場合や、アプリが 4 GB を超えるメモリを必要とする場合など、64 ビットの計算を行う場合です。

于 2008-10-14T06:25:27.033 に答える
5

コードが実行される JVM は同じように動作する必要があるため (整数は常に 32 ビット符号付きなど)、実行するプラットフォームに関係なく、コードは (理論的には) 同じように実行されることが保証されます。

32/64 ビットの違いは、JVM がランタイムを最適化する方法にあります。したがって、実行されたバイトコードは同じままですが、別の方法で最適化される (または最適化されない) 可能性があります。

簡単に言うと、Java を実行している 64 ビット システムは、同等の 32 ビット システムよりも高速にコードを実行する可能性があります。

于 2008-10-14T06:17:27.767 に答える
3

何も変更する必要はありません。C や C++ とは異なり、Java には、使用しているプラ​​ットフォームに関係なく、int (およびその他のデータ型) が常に同じ長さであることを保証する仕様が書かれています。

于 2008-10-14T06:11:02.740 に答える
2

アプリケーション コードに JNI はありますか? 次に、32 ビットと 64 ビットのネイティブ バイナリについて心配する必要があるかもしれません。

32 または 64 は、Java コードではすべて同じです。パフォーマンスの側面は、以前のポスターですでに十分にカバーされているようです。

于 2009-07-24T13:25:44.597 に答える
1

はい、何も変更する必要はありません。異なるのは JRE であり、作成するコードではありません。

于 2008-10-14T06:14:18.243 に答える
0

これを試して:

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 ビットの違いを笑ってください。

于 2014-01-27T22:02:05.763 に答える