我有一个 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/