小编典典

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

java

我有一个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 的性能?


阅读 346

收藏
2020-12-03

共1个答案

小编典典

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

尝试istream::getline

后来

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

甚至以后

在我的旧Linux笔记本上,与C ++
getline相比,jdk1.7.0_21和不告诉我它很旧的4.3.3花费的时间大约相同。(我们已经确定,阅读单词的速度较慢。)-O0和-O2之间没有太大区别,考虑到循环中代码的简单性,这也不足为奇。

最后的 提示正如我所建议的那样,LEN。1MB的fin.read(buffer,LEN)并使用memchr扫描’\
n’会导致速度再提高约20%,这使得C(现在)比Java快。

2020-12-03