FSANF 与 IF流速度

fscanf vs ifstream speed

本文关键字:速度 IF FSANF      更新时间:2023-10-16

我推测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

ifstreamfscanf慢两倍多。fscanf从哪里得到这么多速度?

编辑:

我使用的是相当现代的 64 位英特尔 Mac,使用 xcode 附带的命令行工具,以防万一它是相关的。

fscanf根本不

需要解析格式字符串。 它使用贪婪算法来查找'%'字符,然后使用简单的 switch 语句来生成输入。 另一方面,ifstream需要对其 vtable 执行查找,以确定如何使用输入的每个分钟详细信息。

话虽如此,如果不改变 C 库,就无法扩展fscanf,而ifstream就像对其进行子类化一样简单。

编辑:所有这些也是 C 的 fscanf 库例程投入了更多时间/工作和更多优化机会的一部分。 C++库只是C++标准的任意结果,因此没有对其进行同样的审查。