使用Java发送字节数组的最快方法是什么?以及如何衡量它?

时间:2015-12-27 07:10:22

标签: java networking tcp nio

使用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次迭代。没有类加载,没有垃圾收集

1 个答案:

答案 0 :(得分:0)

Microbenchmarking正在提供错误的结果。如果我们没有考虑每次迭代的时间,但是1000次迭代的时间除以1000,我们将得到更准确的结果