java - 为什么 InputStream.available() 如此耗时?

标签 java io profiling pcap jvisualvm

我已经实现了自己的类来读取pcap文件。 (二进制文件,即tcpdump、wireshark)

public class PcapReader implements Iterator<PcapPacket> {
    private InputStream is;

    public PcapReader (File file) throws FileNotFoundException, IOException {
        is = this(new DataInputStream(
             new BufferedInputStream(
                 new FileInputStream(file))));
    }

    @Override
    public boolean hasNext () {
        try {
            return (is.available() > 0);
        } catch (IOException e) {
            return false;
        }
    }

    //pseudo code!
    @Override
    public PcapPacket next () {
        is.read(header);
        is.read(body);

        return new PcapPacket(header, body);
    }

    //more code here
}

然后我这样使用它:

PcapReader reader = new PcapReader(file);
while (reader.hasNext()) {
    PcapPacket pcapPacket = reader.next();
    //process packet
}

测试中的文件有 190 Mb。我还使用 JVisualVM 进行分析。

  • hasNext() 被调用 170 万次,时间为 7.7

  • next() 被调用相同次数,时间为 3.6

我的主要问题是为什么 hasNext() 在绝对值上如此耗时,并且比 next 长两倍?

最佳答案

当您在 hasNext() 方法中调用 is.available() 时,它会进入 FileInputStream.available() 实现。这是一种 native 方法,如 FileInputStream source code 中所示。 .

最后,这确实是一个耗时的操作,因为文件操作的操作系统实现必须提前检查是否有更多数据可供读取。因此,它实际上会执行读取操作,而不更新文件指针(或将其更新回原始位置),只是检查是否有“下一个”字节。

关于java - 为什么 InputStream.available() 如此耗时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15249491/

相关文章:

java - 复选框 - 列表元素

perl - 管道中的数据是否会排队等待 Perl 读取?

function - 为什么返回函数叫return?

python-3.x - 剖析异步 websocket 应用程序

c++ - 分析_mm_setzero_ps和{0.0f,0.0f,0.0f,0.0f}

java - 使用 Java Spark mongodb 数据

JAva/Android - 添加到长时间没有效果

java - 如何解析/编码二进制消息格式?

python - 在不加载到内存的情况下查找保存的 numpy 数组(.npy 或 .npz)的形状

c# - 有什么方法可以在 Sql Profiler 或类似工具中获取 .net 堆栈跟踪?