java - 为什么 Java 读取大文件的速度比 C++ 快?

标签 java c++ file

我有一个 2 GB 的文件 (iputfile.txt),其中文件中的每一行都是一个单词,就像:

apple
red
beautiful
smell
spark
input

我需要编写一个程序来读取文件中的每个单词并打印字数。我使用 Java 和 C++ 编写了它,但结果令人惊讶:Java 的运行速度比 C++ 快 2.3 倍。我的代码如下:

C++:

int main() {
    struct timespec ts, te;
    double cost;
    clock_gettime(CLOCK_REALTIME, &ts);

    ifstream fin("inputfile.txt");
    string word;
    int count = 0;
    while(fin >> word) {
        count++;
    }
    cout << count << endl;

    clock_gettime(CLOCK_REALTIME, &te);
    cost = te.tv_sec - ts.tv_sec + (double)(te.tv_nsec-ts.tv_nsec)/NANO;
    printf("Run time: %-15.10f s\n", cost);

    return 0;
}

输出:

5e+08
Run time: 69.311 s

Java:

 public static void main(String[] args) throws Exception {

    long startTime = System.currentTimeMillis();

    FileReader reader = new FileReader("inputfile.txt");
    BufferedReader br = new BufferedReader(reader);
    String str = null;
    int count = 0;
    while((str = br.readLine()) != null) {
        count++;
    }
    System.out.println(count);

    long endTime = System.currentTimeMillis();
    System.out.println("Run time : " + (endTime - startTime)/1000 + "s");
}

输出:

5.0E8
Run time: 29 s

为什么在这种情况下 Java 比 C++ 快,如何提高 C++ 的性能?

最佳答案

你不是在比较同一件事。 Java 程序读取行,取决于换行符,而 C++ 程序读取空格分隔的“单词”,这有点额外的工作。

试试 istream::getline

稍后

您也可以尝试执行基本的读取操作来读取字节数组并扫描它以查找换行符。

更晚

在我的旧 Linux 笔记本上,与 C++ getline 相比,jdk1.7.0_21 和 don't-tell-me-it's-old 4.3.3 花费的时间大致相同。 (我们已经确定阅读单词会更慢。)-O0 和 -O2 之间没有太大区别,这并不让我感到惊讶,因为循环中的代码很简单。

最后的注释 正如我所建议的,使用 LEN = 1MB 的 fin.read(buffer,LEN) 并使用 memchr 扫描 '\n' 会导致速度再提高约 20%,这使得 C (现在没有任何 C++)比 Java 快。

关于java - 为什么 Java 读取大文件的速度比 C++ 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22955178/

相关文章:

java - Eclipse Java 应用程序从另一个应用程序动态导入 JAR

java - 使用 hockeyapp 的 cocos2dx 中的 C++ 崩溃报告

c++ - 如何在 C++ 中解析数组以查找重复项

c++ - 已修复尝试在反转数组时修复损坏的代码

c - 应该使用什么 mmap、malloc 或文件 I/O

python - Scrapy IO错误: [Errno 22] invalid mode ('wb' ) or filename

java - 如何将javafx中TextArea的isUndoable属性设置为true?

java - 编译opencv时出现"cannot find symbol"

c++ - 如何从C++中的嵌套类调用变量

Python 多文件内容