我有一个 5GB 大小的文件,我想按块读取,比如 2MB。使用java.io.InputStream效果很好。所以我测量了这个东西如下:
static final byte[] buffer = new byte[2 * 1024 * 1024];
public static void main(String args[]) throws IOException {
while(true){
InputStream is = new FileInputStream("/tmp/log_test.log");
long bytesRead = 0;
int readCurrent;
long start = System.nanoTime();
while((readCurrent = is.read(buffer)) > 0){
bytesRead += readCurrent;
}
long end = System.nanoTime();
System.out.println(
"Bytes read = " + bytesRead + ". Time elapsed = " + (end - start)
);
}
}
结果 = 2121714428
可以看出平均需要2121714428纳米。之所以如此,是因为实现确实(*env)->SetByteArrayRegion(env, bytes, off, nread, (jbyte *)buf);将数据读入了ed 或堆栈分配的缓冲区,如此处malloc所示。所以需要相当多的 CPU 时间:memcpy
由于 JNI 规范定义了
在临界区内,本机代码不得调用其他 JNI 函数,或任何可能导致当前线程阻塞并等待另一个 Java 线程的系统调用。(例如,当前线程不得在另一个 Java 线程写入的流上调用 read。)
繁花不似锦
相关分类