本帖最后由 MoonCakeMC 于 2023-3-18 20:23 编辑
如题,应该不算纯提问吧
首先说下背景
打OI的人应该都知道
输入输出是很费时间的
所以会有一系列的卡常技巧
比如用scanf替代cin,printf替代cout
数据量再大的时候还可以自己写快读快出
之前我非常坚信
快读<scanf<cin(指时间
而且我非常坚信手写快读是最快的()
但是仍然众所周知
cin慢是因为有个东西叫sync_with_stdio
据说把它关了就能和scanf差不多了
但是前几天我突发奇想
于是写了个python来测速度
虽然说python运行速度非常令人诟病
但是拿来记个时我觉得是没问题的
于是就有了如下的神奇结果
(从long long下限到long long上限随机数据,同组数据重复测试10次取平均值)
(待会优化成不同组数据跑10次,不过结果应该一样)
用我的代码跑的结果不同的大佬也可以发一下
不过我在我两台配置差了不少的电脑上跑
虽然结果不同,但是名次和差的数量级是一样的
代码如下:
judge.py
cin.cpp
cin_without_sync.cpp
scanf.cpp
read.cpp
不知道为什么,关了同步的cin比快读还快一些
有大佬可以说一下为什么吗()
(关同步不比快读好背
)
(不过我的快读是我常用快读,还不是究极快读,待会试试究极快读)
经验+7/3,金粒+5,逃
如题,应该不算纯提问吧
首先说下背景
打OI的人应该都知道
输入输出是很费时间的
所以会有一系列的卡常技巧
比如用scanf替代cin,printf替代cout
数据量再大的时候还可以自己写快读快出
之前我非常坚信
快读<scanf<cin(指时间
而且我非常坚信手写快读是最快的()
但是仍然众所周知
cin慢是因为有个东西叫sync_with_stdio
据说把它关了就能和scanf差不多了
但是前几天我突发奇想
于是写了个python来测速度
虽然说python运行速度非常令人诟病
但是拿来记个时我觉得是没问题的
于是就有了如下的神奇结果

(从long long下限到long long上限随机数据,同组数据重复测试10次取平均值)
(待会优化成不同组数据跑10次,不过结果应该一样)
用我的代码跑的结果不同的大佬也可以发一下

不过我在我两台配置差了不少的电脑上跑
虽然结果不同,但是名次和差的数量级是一样的
代码如下:
judge.py
cin.cpp
cin_without_sync.cpp
scanf.cpp
read.cpp
不知道为什么,关了同步的cin比快读还快一些
有大佬可以说一下为什么吗()
(关同步不比快读好背


(不过我的快读是我常用快读,还不是究极快读,待会试试究极快读)
但是关了同步好像就不能用scanf了的来着,要是记错了就当个乐子吧,毕竟我才刚上手c++(
我就知道java那个sout里面很多个同步锁(
看来低耦合确实能挤出一些效率来
LinGCar 发表于 2023-3-18 20:32
我就知道java那个sout里面很多个同步锁(
如果我没记错,同步锁是 PrintStream 的锅
你不妨把它当成一个正常的 OutputStream 然后往里面扔 byte[] (确信)
C++?我只知道
Scanner in = new Scanner(System.in);
int a = in.nextInt();

Scanner in = new Scanner(System.in);
int a = in.nextInt();

DarkLiam 发表于 2023-3-18 20:28
但是关了同步好像就不能用scanf了的来着,要是记错了就当个乐子吧,毕竟我才刚上手c++( ...
我也记得是这样()
但是既然cin都高效率了为什么不直接cout

(不过cout的格式化输出确实比较难受)
有考虑编译器和汇编的情况嘛,如果要细究的话,就不能只停在高级语言的层面了

Doomsday_Envoy 发表于 2023-3-18 21:52
有考虑编译器和汇编的情况嘛,如果要细究的话,就不能只停在高级语言的层面了 ...
本来想考虑一下的

但是最近环境不太方便反汇编()
而且devcpp编译出来的好像不是很适合反汇编()
而且输入好像还涉及到什么缓冲区之类的
这我就真不懂了,而且感觉汇编会很复杂(

大佬愿意的话可以细究一下然后跟我说说
