使用Java在TCP套接字上发送1000字节数组的最快方法是什么?以及如何衡量它?
如果我的代码发送1000个字节arrya 25_000次到" localhost"同一台机器的测量结果是否公平?
如何实现最快的传输速率?
ByteBuffer buffer = ByteBuffer.allocateDirect( 1000 );
SocketChannel clientSocketChannel = SocketChannel.open( new InetSocketAddress( "localhost", 8888 ) );
clientSocketChannel.socket().setTcpNoDelay( true );
// empty array of bytes
byte[] array = new byte[BUFFER_SIZE];
for ( int i = 0; i < 25_000; i++ ) {
buffer.put( array );
buffer.flip();
long start = System.nanoTime();
// ==========================================
do {
int len = clientSocketChannel.write( buffer );
if (len < 0)
throw new EOFException();
} while (buffer.hasRemaining());
// ==========================================
long elapsed = System.nanoTime() - start;
System.out.println( i + ":\t" + elapsed );
buffer.flip();
}
System.out.println( "Client: finished" );
我在执行期间得到这些数字:
14669: 14543
14670: 62877
14671: 14971
14672: 13687
14673: 70576
14674: 20104
14675: 16254
14676: 60311
14677: 15826
14678: 15826
14679: 18820
14680: 13688
14681: 12832
14682: 12832
14683: 14115
14684: 12831
14685: 12832
14686: 14971
14687: 4705
14688: 4277
14689: 4278
14690: 4277
14691: 3849
14692: 4705
14693: 4706
14694: 4278
14695: 4705
14696: 4277
14697: 4277
14698: 4705
14699: 3849
14700: 4277
14701: 4277
因此,对于100次迭代,它会更快 - 然后返回
15067: 14115
15068: 16254
15069: 19248
15070: 13687
15071: 13259
15072: 14115
15073: 14970
15074: 15827
15075: 14543
15076: 16682
15077: 14116
15078: 16254
15079: 14543
15080: 16253
iperf实用程序向我显示loppback可以每秒传输200 MBytes。这大约是每1000字节4微秒。因此,执行我的程序传输速率确实可以实现这个速率 - 但是每1000字节消息会不时下降到14-15微秒。这里没有涉及JIT,因为JIT正在进行首次10.000次迭代。没有类加载,没有垃圾收集
答案 0 :(得分:0)
Microbenchmarking正在提供错误的结果。如果我们没有考虑每次迭代的时间,但是1000次迭代的时间除以1000,我们将得到更准确的结果