java - C++ ifstream.getline() 明显比 Java 的 BufferedReader.readLine() 慢?

标签 java android c++ java-native-interface android-ndk

我正在重写我的一个 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++ 中逐行读取文件?谢谢。

最佳答案

一个想法是 stdio 同步可能会减慢您的速度。可以将其关闭。我不知道这是否可以解释所有差异,但您可以尝试。此外,您没有正确使用 eof() 。最后,我将使用 getline()

的 std::string 版本
std::ios::sync_with_stdio(false);
ifstream ifs("/sdcard/testfile.txt");
std::string line;
while (getline(ifs, line))
{
    LOGD(line);
}

我还没有测试过这段代码,但你可以试试看它是否有所作为。

关于java - C++ ifstream.getline() 明显比 Java 的 BufferedReader.readLine() 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6820765/

相关文章:

java - Hibernate 从一对多连接中获取一列

Android TextView 以及如何确定可见字符数

android - 用专用设备 UI 完全替换 Android 前端 UI

C++ Ranges TS 包括实验路径

java - MongoDB:合并两个 .find() 语句

java - Maven编译错误: package does not exist and cannot find symbol

java - 我可以在 Android 上调用从 Java 内部生成图像的 C 程序吗?

android - 如何获取SD卡上的视频列表

c++ - 在设置值之前是否必须调用 promise.get_future() ?

c++ - 不匹配 operator= 错误