我有一个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个周期。 使用 (如果可用,则返回。)实现,具体取决于运行的
为什么我的程序在读取文件时忽略零?例如,以下是文件中的数字: 这是我的输出: 这是我的代码: