首页 > 编程语言 >C++ 文件读入速度测试

C++ 文件读入速度测试

时间:2023-01-06 12:55:38浏览次数:40  
标签:return 读入 int namespace C++ ++ 测试 using include

在信息学竞赛中,输入数据规模可能会很大,这时候就需要注意文件读取的效率。本文在 Linux 环境下测试了 C++ 几种常见读入方式的效率。

1. 系统环境

Arch Linux x86_64
默认 Linux 内核,版本 6.1.3
gcc 12.2.0
ext4

2. 测试代码

编译命令(省略文件):g++ -std=c++20

2.0 随机整数(32位有符号)生成

#include <climits>
#include <fstream>
#include <random>
using namespace std;

using i64 = long long;

int main()
{
    constexpr int N = 10000;
    ofstream fout("in");
    random_device rd;
    mt19937 gen(rd());

    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j)
            fout << (i64)gen() + (i64)INT_MIN << ' ';
        fout << '\n';
    }
    return 0;
}

2.1 freopen + scanf

#include <cstdio>
using namespace std;

int main()
{
    freopen("in", "r", stdin);
    constexpr int N = 10000;
    int x;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            scanf("%d", &x);
    return 0;
}

2.2 FILE*

#include <cstdio>
using namespace std;

int main()
{
    FILE *fp = fopen("in", "r");
    constexpr int N = 10000;
    int x;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            fscanf(fp, "%d", &x);
    return 0;
}

2.3 ifstream

#include <fstream>
using namespace std;

int main()
{
    ifstream fin("in");
    constexpr int N = 10000;
    int x;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            fin >> x;
    return 0;
}

2.4 快读

从洛谷模板题快速排序的最优解复制的快读模板(做了少量修改)

#include <cctype>
#include <cstdio>
#include <cstring>
using namespace std;

namespace IO
{
class qistream
{
    static const size_t SIZE = 1 << 16, BLOCK = 32;
    FILE *fp;
    char buf[SIZE];
    int p;

  public:
    qistream(FILE *_fp = stdin) : fp(_fp), p(0)
    {
        fread(buf + p, 1, SIZE - p, fp);
    }

    void flush()
    {
        memmove(buf, buf + p, SIZE - p), fread(buf + SIZE - p, 1, p, fp), p = 0;
    }

    qistream &operator>>(char &str)
    {
        str = getch();
        while (isspace(str))
            str = getch();
        return *this;
    }

    template <class T> qistream &operator>>(T &x)
    {
        x = 0;
        p + BLOCK >= SIZE ? flush() : void();
        bool flag = false;
        for (; !isdigit(buf[p]); ++p)
            flag = buf[p] == '-';
        for (; isdigit(buf[p]); ++p)
            x = x * 10 + buf[p] - '0';
        x = flag ? -x : x;
        return *this;
    }

    char getch() { return buf[p++]; }

    qistream &operator>>(char *str)
    {
        char ch = getch();
        while (ch <= ' ')
            ch = getch();
        for (int i = 0; ch > ' '; ++i, ch = getch())
            str[i] = ch;
        return *this;
    }
};
} // namespace IO

int main()
{
    FILE *fp = fopen("in", "r");
    IO::qistream fin(fp);
    constexpr int N = 10000;
    int x;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            fin >> x;
    return 0;
}

3. 测试方法

  1. 运行一遍随机整数生成。输出的 in 文件作为 4 份代码共同的输入文件。
  2. 依次运行 4 份代码,每份代码运行 5 次,使用 bash 内置 time 命令进行计时,取最后 3 次运行时间取平均数。

4. 测试结果

freopen + scanf FILE* ifstream 快读
10.857s 11.396s 7.526s 5.402s

可见,C++ 的 ifstream 相较 C 的 freopen + scanf 或 FILE* 拥有更好的性能。如果需要进一步加速,可以使用快读。

标签:return,读入,int,namespace,C++,++,测试,using,include
From: https://www.cnblogs.com/o311243/p/cpp_file_input_efficiency_test.html

相关文章

  • 测试3
    啊手动阀手动阀  啊手动阀阿松大......
  • 测试
      中文名称:3-(2'-螺旋金刚烷)-4-甲氧基-4-(3"-磷酰氧基)苯-1,2-二氧杂环丁烷;-磷酰英文名称:AMPPDCAS号:122341-56-4规格:10mg,250mg,1g,10g,25g,......
  • 纳多德助力国家超算深圳中心,建设高性能计算通用测试平台
    国家超级计算深圳中心是国家863计划、广东省和深圳市重大项目,2009年获国家科技部批准成立,是深圳建市以来投资规模最大的国家级重大科技创新基础设施,是深圳作为创新型城市的......
  • 软件测试和前端开发哪个发展更好?
    没有最好的,只有最适合自己的工作,但是不论是哪个岗位,都是需要不断地更新学习新的知识,这样才能让自己在岗位上立于不败之地。 首先测试和前端虽然都是身处互联网......
  • 亚马逊带绳窗帘测试标准
    美国消费品安全委员会于2022年11月2日通过了一项新的联邦安全标准。该标准适用于定制窗帘的操作绳,目的是降低带绳窗帘导致儿童窒息死亡和严重危及生命的伤害的风险。委员会......
  • 软件测试行业的现状和发展趋势
    小编已经与测试行业打交道十多年了,在此期间目睹了测试行业的兴起,并目睹了最早的测试行业人员逐渐被取代,有很多感受。今天,让我们来谈谈测试行业的现状和发展,希望我能帮......
  • CodeArts TestPlan:一站式测试管理平台
    摘要:华为云正式发布CodeArtsTestPlan,这是一款自主研发的一站式测试管理平台,沉淀了华为30多年高质量的软件测试工程方法与实践,覆盖测试计划、测试设计、测试执行和测试评估......
  • 功能测试如何晋升测试开发?
    大致分为这几个步骤:测试工具使用—编程语言—测试框架—测试框架开发。 1、测试工具使用首先是测试工具的使用,比如说要去进行web自动化首先要做的事情就是......
  • C++中对句柄Handle的理解
    在C++的初学者中,很容易把句柄理解成指针,但其实,句柄并不是指针. 那么句柄是什么,一句话,句柄是资源(或项目)的唯一标识。我们需要搞清楚的是,句柄Handle到底是怎么来标识......
  • 基于Mockito的Android应用单元测试
    Mockito是java开发中常用的Mock库,在Android应用单元测试中比较常见在实际的单元测试中,测试的类之间会有或多或少的耦合,导致无法顺利的进行测试,这是就可以使用Mockito,该库可......