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流接收器上(意味着网络不是原因)。
谢谢!