为什么Java比C++更快地读取一个大文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (330)

我有一个2GB的文件(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++程序则读取空格分隔的“word”,这是一项额外的工作。

试一试istream::getline...

用户回答回答于

在语言处理方式上有许多显著的差异。I/O,所有这些都能带来不同的结果。

扫码关注云+社区

领取腾讯云代金券