我想优化InputStream的读取,然后我认为有一个RAM页面大小的byte []缓冲区会很好。
是否有方法(可能是静态的)知道它的大小?
最后我成功使用了NDK和JNI,我在C中编写了以下代码:
#include <jni.h>
#include <unistd.h>
jlong Java_it_masmil_tests_TestsActivity_pageSize(JNIEnv* env, jobject javaThis) {
return sysconf(_SC_PAGE_SIZE);
}
其中:
我用NDK编译了该文件,然后用Java编写了以下代码:
static {
System.loadLibrary("clibrary");
}
private native long pageSize();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long page = pageSize();
}
其中:
答案 0 :(得分:6)
页面大小由Linux(内核)定义,您可以通过调用libc(bionic)的sysconf(_SC_PAGESIZE)
通过JNI获取它。由于Android在Linux上运行,主要在ARM系统上运行,因此您可以假设4k页面大小。
#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);
但是,您无法轻松地从Java / C中获得这种对齐方式。意思是即使你要求一个4k的块,没有人保证将是4k对齐。
如果你需要在Linux上使用4k对齐块,你应该使用mmap,这可以保证页面大小一致。
答案 1 :(得分:1)
您通常可以假设页面大小为4KB或更大(可以处理较小页面大小的MMU几乎已经绝迹)。此外,如果您没有方法将缓冲区与精确页面边界对齐,则很可能仍会跨越两页。
最后,所有这些努力都被完全浪费了 - 如果MMU遭受一两页错失,那么实际的I / O成本将会被许多数量级所掩盖。甚至你甚至不可能恢复增加的初始化成本,更不用说你花在实现它上的所有时间。
你做了一个过分热情的优化工作的完美例子,你可以花费所有的时间来获得更大的回报(例如),如果你只是简单地描述你的应用并且在最常被称为的方法中削减了一到两个周期。 / p>
答案 2 :(得分:-1)
很难相信添加JNI等会真正偿还成本。像其他人一样使用4096或8192。