fscanf vs ifstream speed

时间:2014-04-28 00:21:34

标签: c++ iostream stdio

我猜测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附带的命令行工具,以防它完全相关。

1 个答案:

答案 0 :(得分:-2)

fscanf根本不需要解析格式字符串。它使用贪婪算法查找'%'字符,然后使用简单的switch语句生成输入。另一方面,ifstream需要在其vtable上执行查找,以确定如何使用输入的每个细节。

所有这些说法,fscanf无法在不改变C库的情况下进行扩展,而ifstream就像对其进行子类化一样简单。

编辑: 所有这一切也是C&#39 fscanf库例程中投入更多时间/工作和更多优化机会的事实的一部分。 C ++库只是C ++标准的任意结果,因此没有对其应用相同的审查。