2

Intel はリトル エンディアン アーキテクチャを使用していると聞いたので、CPU にバイト バッファをリトル エンディアンで提供する方が優れている/高速です。また、ネットワークはビッグエンディアンで動作すると聞いています。

では、Java NIO ByteBuffers を使用してネットワーク IO を実行するとき、つまり、あるマシンから別のマシンにワイヤを介してバイトを送信するときに、何を使用すべきかを誰かが説明できますか?

ずっとリトルエンディアンを使うだけですか?それは問題ですか?

4

2 に答える 2

3

Java NIO ByteBuffers を使用してネットワーク IO を実行するときに何を使用する必要があるかを誰かが説明できますか?

相手が期待するものと一致する必要があります。

あるマシンから別のマシンにワイヤを介してバイトを送信するときは?

1 Gb ネットワークであっても、得られるパフォーマンスの向上はほとんど問題にならないため、問題にならない場合はデフォルトのままにします。

マシンのネイティブエンディアンを使用したい場合は、使用できます

ByteBuffer.order(ByteBuffer.nativeOrder());

所要時間の比較はこちら

public static void main(String... args) {
    ByteBuffer bb = ByteBuffer.allocateDirect( 1024 * 1024);
    for (int i = 0; i < 5; i++) {
        testEndian(bb.order(ByteOrder.LITTLE_ENDIAN));
        testEndian(bb.order(ByteOrder.BIG_ENDIAN));
    }
}

public static void testEndian(ByteBuffer bb) {
    long start = System.nanoTime();
    int runs = 100;
    for (int i = 0; i < runs; i++) {
        bb.clear();
        int count = 0;
        while (bb.remaining() > 3)
            bb.putInt(count++);
        bb.flip();
        int count2 = 0;
        while (bb.remaining() > 3)
            if (count2++ != bb.getInt())
                throw new AssertionError();
    }
    long time = System.nanoTime() - start;
    System.out.printf(bb.order() + " took %,d μs to write/read %,d ints%n", time / 1000 / runs, bb.capacity() / 4);

}

版画

LITTLE_ENDIAN took 1,357 μs to write/read 262,144 ints
BIG_ENDIAN took 1,484 μs to write/read 262,144 ints
LITTLE_ENDIAN took 867 μs to write/read 262,144 ints
BIG_ENDIAN took 880 μs to write/read 262,144 ints
LITTLE_ENDIAN took 860 μs to write/read 262,144 ints
BIG_ENDIAN took 881 μs to write/read 262,144 ints
LITTLE_ENDIAN took 853 μs to write/read 262,144 ints
BIG_ENDIAN took 879 μs to write/read 262,144 ints
LITTLE_ENDIAN took 858 μs to write/read 262,144 ints
BIG_ENDIAN took 871 μs to write/read 262,144 ints

リトルエンディアンを使用すると、1 MB のデータで約 20 μs (1 ms の 1/1000) 短縮されます。1 Gb で 1 MB を送信するには、約 9,000 μs かかります。

于 2012-10-01T18:21:36.877 に答える
0

基本的に決して。ほとんどのネットワーク プロトコルは、ビッグ エンディアンである「ネットワーク バイト オーダー」で定義されます。反対側に Intel アーキテクチャがあることがわかっている場合は、リトル エンディアンを使用できますが、本当にそれを知っていますか? 永遠に?

于 2012-10-03T10:01:27.703 に答える