FSANF 与 IF流速度
fscanf vs ifstream speed
我推测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 位英特尔 Mac,使用 xcode 附带的命令行工具,以防万一它是相关的。
fscanf
根本不需要解析格式字符串。 它使用贪婪算法来查找'%'
字符,然后使用简单的 switch 语句来生成输入。 另一方面,ifstream
需要对其 vtable 执行查找,以确定如何使用输入的每个分钟详细信息。
话虽如此,如果不改变 C 库,就无法扩展fscanf
,而ifstream
就像对其进行子类化一样简单。
编辑:所有这些也是 C 的 fscanf
库例程投入了更多时间/工作和更多优化机会的一部分。 C++库只是C++标准的任意结果,因此没有对其进行同样的审查。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么在读取文件大小时文件IO速度会发生变化
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- if数组上的随机数
- C++if语句速度
- 'if'功能在C++中具有可读性是否存在速度差异?
- C语言中If-Else和三元运算符的速度差异
- FSANF 与 IF流速度