首页 > 编程语言 >OI 中各种输入方式的速度比较(C++,大量实测数据,附图表)

OI 中各种输入方式的速度比较(C++,大量实测数据,附图表)

时间:2024-07-28 23:06:46浏览次数:18  
标签:ch OI int ios cin C++ read 实测 ms

测试信息

本次共测试了以下几种输入方式的速度:

  • scanf
  • cin
  • 快读
  • 位运算快读
  • fread() + 位运算快读
  • 关闭同步流的 cin
  • 开启 tie 绑定并关闭同步流的 cin

每组测试各输入方式均使用相同数据,为随机生成的 \(1000000\)(1E6) 个整数,范围在 \([-(2^{31}-1),2^{31}-1]\)(即 int 范围)。

所用配置为 12th Gen Intel(R) Core(TM) i5-12400 2.50 GHz,操作系统为 Windows 11


所用代码:

数据生成

#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;

const int N=1e6;

inline int large_rand()
{
	bool op=rand()&1;
	long long huge_rand=rand()+(rand()<<15)+(rand()<<30);
	return op?-(huge_rand%(1ll<<32)):huge_rand%(1ll<<32);
}
int main()
{
	freopen("input.in","w",stdout);
	srand(time(NULL));
	for(int i=1;i<=N;i++)
		printf("%d ",large_rand());
	fclose(stdout);
	freopen("log.txt","a+",stdout);
	printf("Succeeded generated data.\n");
	fclose(stdout);
	return 0;
}

计时等部分

#include<cstdio>
#include<windows.h>
using namespace std;

const int N=1e6;

int main()
{
	freopen("input.in","r",stdin);
	freopen("log.txt","a+",stdout);
	
    LARGE_INTEGER StartingTime,EndingTime,ElapsedMicroseconds;
    LARGE_INTEGER Frequency;

    QueryPerformanceFrequency(&Frequency);
    QueryPerformanceCounter(&StartingTime);
	
	...

    QueryPerformanceCounter(&EndingTime);
    printf("xxx: %.4f ms\n",1000*((double)EndingTime.QuadPart-StartingTime.QuadPart)/Frequency.QuadPart);
    
    fclose(stdin);
	return 0; 
}

scanf

	int x;
    for(int i=1;i<=N;i++)
    	scanf("%d",&x);

cin

	int x;
    for(int i=1;i<=N;i++)
    	cin>>x;

快读

int read()
{
	int x=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*w;
}
...
	int x;
    for(int i=1;i<=N;i++)
    	x=read();

位运算优化快读

int read()
{
	int x=0,w=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();}
	return x*w;
}
...
	int x;
    for(int i=1;i<=N;i++)
    	x=read();

fread() + 位运算优化快读

const int MAXSIZE=1<<20;
char buf[MAXSIZE],*p1,*p2;
#define gc()                                                               \
  (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) \
       ? EOF                                                               \
       : *p1++)

int rd()
{
	int x=0,f=1;
	char c=gc();
	while(!isdigit(c))
	{
		if(c=='-') f=-1;
		c=gc();
	}
	while (isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=gc();
	return x*f;
}
...
	int x;
    for(int i=1;i<=N;i++)
    	x=rd();

关闭同步流的 cin

	std::ios::sync_with_stdio(false);
	int x;
    for(int i=1;i<=N;i++)
    	cin>>x;

开启 tie 绑定并关闭同步流的 cin

	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int x;
    for(int i=1;i<=N;i++)
    	cin>>x;

测试结果

log.txt 输出信息

#1
Succeeded generated data.
scanf: 425.8919 ms
cin: 1128.8144 ms
read: 204.4151 ms
read+: 208.4703 ms
read++: 35.9450 ms
cin ios: 127.2909 ms
cin tie ios: 129.4965 ms

#2
Succeeded generated data.
scanf: 442.5600 ms
cin: 1260.4899 ms
read: 210.9504 ms
read+: 209.6824 ms
read++: 44.4940 ms
cin ios: 127.7128 ms
cin tie ios: 144.6090 ms

#3
Succeeded generated data.
scanf: 438.7641 ms
cin: 1166.4752 ms
read: 213.7551 ms
read+: 230.8293 ms
read++: 44.0495 ms
cin ios: 135.8041 ms
cin tie ios: 137.5192 ms

表格统计

表格统计

图表统计

统计表

根据统计,在百万较长整数(大多是九到十位数)的测试数据下,fread()等优化后的超级快读速度极快,快读及位运算优化快读的效率相似,iostie 优化后的 cin 效率较高,scanf 稍慢,裸 cin 的效率极低

标签:ch,OI,int,ios,cin,C++,read,实测,ms
From: https://www.cnblogs.com/jerrycyx/p/18329120

相关文章

  • C++ 中缀表达式判断合法性并求值
    中缀表达式值题目描述输入一个中缀表达式(由0−9组成的运算数、加+减−乘∗除/四种运算符、左右小括号组成。注意“−”也可作为负数的标志,表达式以“@”作为结束符)。判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并......
  • VS2022创建C C++ GTEST工程
    原因需要对带代码进行单元测试,选择在Visualstudio中使用GTEST框架。实施创建一个常规的控制台可执行程序。然后使用NUGET安装包安装GTEST头文件和动态库,同时安装GTESTADAPTER。安装可能提示找不到包源,此时需要根据提示配置一下,注意通配符很关键,不要问为甚吗,就是有bug......
  • OI 回忆录 2 - 我的学长们
    cxr说起学长,这就不得不先提到cxr了。他自己本身就非常强,高一进入集训队,创造qzez历史,于是在高二的时候非常照顾初三的我们日常训练,包括帮助调题、提供模拟赛等等方方面面。每次来到机房的时候cxr总是坐在固定的那个位置,cxr就是我们的老大哥,我们的主心骨。cxr在机房的时......
  • C++ 笔记(一)数据类型(1)
    1简单的变量变量名命名规则如下变量名称可以包含字母、数字和下划线(_)。变量名称的第一个字符必须是字母或下划线。区分大小写,即大写字母和小写字母被认为是不同的字符。不能使用C++的关键字作为变量名。2数据类型2.1整型short、int、long和longlong这四种类型都是......
  • C++关键字——inline和auto
    目录一、前言 二、inline关键字(C++11)---多用于内联函数a.概念b.特性三、auto关键字(C++11)a.auto简介b.auto的使用细则c.auto不能推导的场景d.基于范围的for循环(C++11)一、前言C++总计63个关键字,我们先了解inline和auto这两个关键字。asmdoifreturntrycontinue......
  • 三种语言实现高精度加法(C++/Python/Java)
    题目给定两个正整数(不含前导00),计算它们的和。1≤整数长度≤100000C++#include<bits/stdc++.h>usingnamespacestd;vector<int>add(vector<int>&A,vector<int>&B){if(A.size()<B.size())returnadd(B,A);vector<int>C;......
  • CQOI2024AFO记——一半的奇迹
    我依然可以骄傲地说,我从未后悔过选择OI。一些微不足道的小事day-??????tyl:你会写退役记吗?我:肯定会的。day-?????那个心碎的下午。我是最后一个离开的。Chery:唉,多好的孩子。少了点什么呢?(停顿)少了点儿灵气。day-????WC2024。和许许多多的人约定了NOI见。day......
  • 24.07.28 周总结 (kotlin加深 + Android studio 学习)
    Kotlin学习子类的属性覆盖AndroidstudioAI解决问题......
  • 互联网大裁员背景下C++程序员该如何突围?
    一、前言              近期遇到许多正在找工作的小伙伴感叹今年工作难找,往年互联网上升期的时候,北京互联网行业不光工资给的高,而且坑也多,就拿互联网前几大语言来说,20年北京区Java招聘岗位10万+,目前只有不到1万+,20年北京区python招聘岗位3万+,2024年4月份不到5......
  • C++从入门到起飞之——内存管理(万字详解) 全方位剖析!
    ......