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 かかります。