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
}
テスト対象のファイルの容量は190Mbです。また、JVisualVMを使用してプロファイルを作成します。
hasNext()
は170万回呼び出され、時間は7.7秒ですnext()
同じ回数呼び出され、時間は3.6秒です
私の主な質問は、なぜhasNext()
絶対値でこれほど時間がかかり、またその2倍の時間がかかるのnext
かということです。