2013-11-27 38 views
1

当前我正在Java TCP Socket上编写视频流接收器。我已经设法显示流,但我很关心套接字读取的性能,因为我需要减少延迟。当读取小字节长度时使用DataInputStream缓慢读取性能

每个视频有效载荷的前8个字节代表视频有效载荷本身的长度。所以我必须首先获得视频有效载荷的长度,然后在将视频有效载荷传递给解码器之前读取视频有效载荷,直到达到指定的长度。该代码是这样的:

boolean isRunning = true; 
boolean isReadingHeader = true; 
byte[] headerBuff = new byte[8]; 
byte[] videoBuff; 
Socket socket; 
/* socket setup goes here */ 
DataInputStream dis = new DataInputStream(socket.getInputStream()); 
while(isRunning) 
{ 
    if(isReadingHeader) /* reading the header to get the length */ 
    { 
     long start = System.currentTimeMillis(); 
     dis.readFully(headerBuff); 
     long end = System.currentTimeMillis() - start; 
     System.out.println("Read Header : " + end + " ms"); 
     int len = .... 
     videoBuff = new byte[len]; 
     isReadingHeader = false; 
    } 
    else /* reading the video payload*/ 
    { 
     long start = System.currentTimeMillis(); 
     dis.readFully(videoBuff); 
     long end = System.currentTimeMillis() - start; 
     System.out.println("Read Payload: " + end + " ms"); 
     /* Passing to Decoder goes here */ 
     isReadingHeader = true; 
    } 
} 

由于输出是无止境的,我把前20个输出如下(输出后是洽):

Read Header : 6 ms 
Read Payload : 0 ms 
Read Header : 0 ms 
Read Payload : 0 ms 
Read Header : 0 ms 
Read Payload : 0 ms 
Read Header : 200 ms 
Read Payload : 1 ms 
Read Header : 142 ms 
Read Payload : 0 ms 
Read Header : 138 ms 
Read Payload : 0 ms 
Read Header : 135 ms 
Read Payload : 0 ms 
Read Header : 146 ms 
Read Payload : 0 ms 
Read Header : 136 ms 
Read Payload : 0 ms 
Read Header : 147 ms 
Read Payload : 0 ms 

正如你所看到的,阅读在读取长度可以为30k ++的视频有效载荷的情况下,在8ms内读入8位字节到100ms到200ms之间的时间为0ms。我想知道为什么它读取8个字节的数据需要很长的时间。我已经在for循环和read()方法中尝试了readByte(),但执行时间却是一样的。仅供参考,我在本地主机上测试了这个延迟问题并没有发生在我的.NET流接收器上(意味着网络不是原因)。

谢谢!

回答

2

而不是

DataInputStream dis = new DataInputStream(socket.getInputStream()); 

尝试使用的BufferedInputStream

DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 

希望它有助于