当前位置: 首页 > 面试题库 >

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

穆文斌
2023-03-14
问题内容

我有一个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和不告诉我它很旧的4.3.3花费的时间大约相同。(我们已经确定,阅读单词的速度较慢。)-O0和-O2之间没有太大区别,考虑到循环中代码的简单性,这也不足为奇。

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



 类似资料:
  • 我最近用Java写了一个计算密集型算法,然后把它翻译成C++。令我吃惊的是,C++的执行速度要慢得多。我现在已经编写了一个更短的Java测试程序,以及一个相应的C++程序-参见下面。我的原始代码具有大量的数组访问功能,测试代码也是如此。C++的执行时间要长5.5倍(请参阅每个程序末尾的注释)。 以下1st21条评论后的结论... null null Java代码: C++代码:

  • 问题内容: 是否存在有关如何以一定速率读取长文件的文章/算法? 说我不想在发出读取数据时以每秒10 KB的速度通过。 问题答案: 粗略的解决方案是一次读取一个块,然后休眠,例如10k,然后休眠一秒钟。但是我要问的第一个问题是:为什么?有两个可能的答案: 您不希望创建工作比完成任务快。要么 您不想在系统上造成太大的负担。 我的建议是不要在读取级别上对其进行控制。这有点混乱和不准确。而是在工作结束时对

  • 问题内容: 我想知道为什么我们通过编译显示“ Hello,World!”的.c文件得到.o文件。是否大于Java .class文件,该文件也显示“ Hello,World!”? 问题答案: Java使用字节码来独立于平台并进行“预编译”,但是字节码由解释器使用并且被提供为足够紧凑,因此您在已编译的C程序中看到的机器代码并不相同。只需看一下Java编译的完整过程即可: 这是Java程序到机器代码转换

  • 问题内容: 我需要非常了解Java和内存问题的人的建议。我有一个大文件(大约1.5GB),我需要将此文件切成许多小文件(例如100个小文件)。 我通常知道如何做到这一点(使用),但是我想知道你是否对内存有任何建议,或者提示如何更快地做到这一点。 我的文件包含文本,它不是二进制文件,每行大约有20个字符。 问题答案: 首先,如果你的文件包含二进制数据,则使用将是一个大错误(因为你会将数据转换为Str

  • 问题内容: 今天,我做了一些快速基准测试来测试and的速度性能: 结果如下: 为什么运行速度差异如此之大? 基准系统: 问题答案: 从这个Oracle博客中: 使用GetSystemTimeAsFileTime方法实现该方法,该方法本质上只是读取Windows维护的低分辨率日期时间值。读取此全局变量自然非常快- 根据报告的信息,大约需要6个周期。 使用 (如果可用,则返回。)实现,具体取决于运行的

  • 为什么我的程序在读取文件时忽略零?例如,以下是文件中的数字: 这是我的输出: 这是我的代码: