如何在数独竞赛中仅计时算法执行阶段,排除IO耗时?
数独竞赛算法执行计时方案(排除文件读写耗时)
以下是几个可行的落地方案,覆盖不同场景需求:
方案1:程序内部拆分计时 + 标准化IO
要求参赛者的代码严格区分IO与核心逻辑,仅对求解过程计时:
- 程序启动后先完成所有输入读取(从标准输入
stdin读取数独数据,加载到内存数组/结构中),这部分不计时 - 启动计时器,执行数独求解的核心算法逻辑
- 停止计时器,将求解结果输出到标准输出
stdout,这部分也不计时 - 额外要求参赛者在程序结束时,单独输出一行计时结果(格式例如
TIME: 156ms),或把计时信息写入标准错误stderr,方便自动化脚本提取统计
这种方案无需额外框架,只要能处理标准IO的编程语言都支持,完全由代码内部控制计时范围,彻底排除IO环节的耗时差异。
方案2:统一封装框架,仅要求实现核心求解接口
主办方提供语言对应的模板代码,包办所有IO操作,参赛者只需要实现核心求解函数:
- 比如Python模板:提供读取输入、写入输出的代码块,要求参赛者实现
solve_single_board(board)和solve_multiple_boards(boards)函数,框架在调用这些函数前后启停计时器 - 对于编译型语言(C/C++/Java):提供统一的程序入口,定义求解接口(如C++的
void solveSudoku(vector<vector<int>>& board)),参赛者只需实现接口逻辑,框架负责IO和计时
这种方案从根源上消除了IO差异,计时精度最高,同时降低了参赛者的代码编写成本,只需要专注于算法本身。
方案3:外部计时脚本 + 进程间通信
用独立的自动化脚本控制整个流程,避免文件IO:
- 脚本预先将所有数独数据读取到内存
- 启动参赛者的程序,通过管道(pipe)或共享内存将内存中的数据传递给程序,跳过文件读写
- 约定通信协议:参赛者程序接收完所有数据后,向脚本发送
READY信号,脚本此时启动计时器 - 参赛者程序完成求解后,向脚本发送
DONE信号,脚本立即停止计时器,再接收求解结果并统一写入验证文件
这种方案不需要修改参赛者的核心算法逻辑,只需要简单约定通信规则,兼容性强,计时完全由外部脚本控制,结果客观公正。
额外注意事项
- 所有测试必须在配置一致的容器内运行,限制CPU核心数、内存配额,避免硬件差异影响计时结果
- 编译型语言需将编译环节与运行环节分离,仅对运行时的核心算法计时
- 可多次运行取平均时间,减少进程调度、缓存等偶然因素的干扰
内容的提问来源于stack exchange,提问作者Henrik Hillestad Løvold
相关产品推荐
相关产品推荐

