我猜测ifstream
会比fscanf
更快,因为fscanf
每次运行都必须解析格式字符串,而ifstream
,我们在编译时知道时间是什么样的事情"我们想读。
但是,当我运行这个快速而肮脏的基准
时#include <ctime>
#include <cstdio>
#include <iostream>
#include <fstream>
using namespace std;
#define NUMBER_OF_NUMBERS 100000000
int nums[NUMBER_OF_NUMBERS];
int main(int argc, char** argv) {
FILE * fp = fopen("nums.txt","r");
auto start = clock();
for (int i = 0; i < NUMBER_OF_NUMBERS; i++)
fscanf(fp,"%d",nums+i);
auto end = clock();
fclose(fp);
auto first = end - start;
ifstream fin("nums.txt");
start = clock();
for (int i = 0; i < NUMBER_OF_NUMBERS; i++)
fin >> nums[i];
end = clock();
fin.close();
auto second = end - start;
cout << "CLOCKS_PER_SEC : " << CLOCKS_PER_SEC << endl;
cout << "first : " << first << endl;
cout << "first (sec) : " << first / CLOCKS_PER_SEC << " seconds" << endl;
cout << "second : " << second << endl;
cout << "second (sec) : " << second / CLOCKS_PER_SEC << " seconds" << endl;
cout << "diff : " << second - first << endl;
cout << "diff (sec) : " << (second - first) / CLOCKS_PER_SEC << " seconds" << endl;
return 0;
}
我得到以下输出:
CLOCKS_PER_SEC : 1000000
first : 12336249
first (sec) : 12 seconds
second : 25738587
second (sec) : 25 seconds
diff : 13402338
diff (sec) : 13 seconds
ifstream
的速度是fscanf
的两倍多。 fscanf
在哪里获得所有这些速度?
编辑:
我使用的是一个相当现代的64位intel mac,使用xcode附带的命令行工具,以防它完全相关。
答案 0 :(得分:-2)
fscanf
根本不需要解析格式字符串。它使用贪婪算法查找'%'
字符,然后使用简单的switch语句生成输入。另一方面,ifstream
需要在其vtable上执行查找,以确定如何使用输入的每个细节。
所有这些说法,fscanf
无法在不改变C库的情况下进行扩展,而ifstream
就像对其进行子类化一样简单。
编辑:
所有这一切也是C&#39 fscanf
库例程中投入更多时间/工作和更多优化机会的事实的一部分。 C ++库只是C ++标准的任意结果,因此没有对其应用相同的审查。