【小测试】当需要构造并输出一个很长的字符串的时候,考虑先存到内存然后用 puts 输出而不是反复调用 putchar

210 篇文章 9 订阅
36 篇文章 0 订阅

题目背景:Codeforces 1328B. K-th Beautiful String(题解
本题按要求输出第 k 小字典序的字符串,字符串含有 n - 2 个 a 和 2 个 b,长为 n。
调用 n 次 putchar 的输出耗时远远长于先存到内存再直接 puts 输出。

附上测试代码与本机测试结果。
这里用输出到文件代替,是因为直接输出在控制台会导致测试时间过长。

#include<cstdio>
#include<chrono>
#include<algorithm>
using namespace std;
using chrono::steady_clock; using chrono::time_point;
#pragma warning(disable:4996)
const unsigned long long n = 1 << 30; char s[n + 1];
time_point<steady_clock> t0, t1;
int main() {
	FILE* f = fopen("o.txt", "w");
	_sleep(5000);
	for (unsigned long long h = 0; h < 10; ++h) {
		_sleep(2000);
		printf("Running on test %llu\n", h);
		t0 = steady_clock::now();
		for (unsigned long long i = 0; i < n; ++i)fputc('a', f);
		t1 = steady_clock::now();
		printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
		t0 = steady_clock::now();
		for (unsigned long long i = 0; i < n; ++i)s[i] = 'a';
		fputs(s, f);
		t1 = steady_clock::now();
		printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
		t0 = steady_clock::now();
		for (auto i = s, ie = s + n; i != ie; ++i)*i = 'a';
		fputs(s, f);
		t1 = steady_clock::now();
		printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
		t0 = steady_clock::now();
		for (auto i = s, ie = s + n - 1; i <= ie; ++i)*i = 'a';
		fputs(s, f);
		t1 = steady_clock::now();
		printf("Time elapsed = %lf\n", (t1.time_since_epoch() - t0.time_since_epoch()) / 1e9);
		putchar('\n');
	}
	return 0;
}

计算机 1 配置:Core i5-8400 + RTX 2060 + DDR4 2666(2CH)+ 杂牌 PCI-E SSD
VS2019 x64 + Release 模式(-O2)和 GCC 9.2 -m64 -O2 -std=c11 -std=c++1z 的测试结果分别是:
在这里插入图片描述在这里插入图片描述计算机 2 配置:Core i3-8100 + GT 730 亮机卡 + DDR4 2400(2CH)+ WD 1TB 蓝盘(with Intel Optane)
VS2019 x64 + Release 模式(-O2)和 GCC 9.2 -m64 -O2 -std=c11 -std=c++1z 的测试结果分别是:
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值