PyPy使用同一变量与新变量的运行时间差异问题(CodeChef案例)
CodeChef ANUWTA 提交运行时间差异原理说明
根因定位
观察到的1.5秒运行时间差确实和类型转换直接相关,核心是两份代码的输出格式符和实际参数类型的匹配度不同:
- 超时提交的代码:在
printf输出计算结果时,使用%d格式符接收long long类型的返回值
对应代码逻辑:printf("%d\n", (long long)(n + 1) * (n + 2) / 2); - 正常通过的代码:使用匹配
long long类型的%lld格式符输出,没有额外转换开销
原理说明
C语言中printf属于可变参数函数,编译阶段不会对可变参数的类型做严格校验,当传入参数类型和格式符要求的类型不匹配时会触发未定义行为:
%d要求传入4字节宽度的int类型,而long long是8字节宽度,运行时系统需要额外做参数截断、内存对齐调整才能匹配格式符要求,单次操作开销极低,但本题测试用例规模最高可达10万级,累计的转换开销就会达到秒级- 类型不匹配还会导致部分测试用例输出结果错误,判定系统额外的结果校验开销也会进一步拉长运行时间,最终导致超时
如果将超时版本的输出格式符修改为%lld,两份代码的运行时间差会缩小到0.1秒以内,完全符合题目时间限制要求。
内容的提问来源于stack exchange,提问作者Purvang Acharya
相关产品推荐
相关产品推荐

