【发布时间】:2011-07-25 18:41:34
【问题描述】:
我正在重写我的一个 Android 应用程序以利用 NDK,它每次要做的第一件事就是打开一个 1.5MB 的文本文件(大约 150k 行)并将每一行在数据结构中。当我使用 Java 的 BufferedReader.readLine() 执行此操作时,从 SD 卡读取文件需要大约 2.5 秒。这是我用于此的代码:
try {
BufferedReader br = new BufferedReader(new FileReader("/sdcard/testfile.txt"));
String thisLine;
while ((thisLine = br.readLine()) != null) {
Log.d(TAG, thisLine);
}
} catch (IOException e) {
//Log error
}
将 C++ 与 ifstream 一起使用需要更长的时间……对于同一个文件,大约需要 3 分钟。这是我在 C++ 中使用的代码:
char buffer[256];
ifstream ifs;
ifs.open("/sdcard/testfile.txt", ifstream::in);
if (ifs.is_open()) {
while (!ifs.eof()) {
ifs.getline (buffer,100);
LOGD(buffer);
}
}
我对 C++ 相当生疏,但对于增加的读取时间想不出任何合乎逻辑的解释。有一段时间我认为这可能是 LOGD 功能,但我尝试将其完全去掉,阅读时间并没有太大帮助。有没有人对问题可能有任何想法?有没有更快的方法在 C++ 中逐行读取文件?谢谢。
【问题讨论】:
-
您的 C++ 代码编译时是否启用了优化?
-
是的,它是用 -O2 编译的(也试过 -O3)。调试已关闭。
-
ifstream ifs.open(...)不会编译... -
我注意到您标记了这个 android,我不是 android 专家,但 c++ 代码是否可能正在回调“java”代码来执行 I/O 操作?
-
@sth:对不起,我试着从记忆中发布这个。它已在 OP 中修复。
标签: java android c++ java-native-interface android-ndk