性能分析与计时
v5.9.0 起整程序由 Python 侧一次调用交给 Go 原生引擎执行(ABI v2),结束后回传寄存器/向量/NZCV/脏内存段/输出。Python 侧不再逐指令记账,旧版的逐指令统计报告选项已随解释器一并移除——性能测量改用程序内计时。
- 内存模型与
--mem-size见 /tools/memory-cache; - 日志级别与错误面板见 /tools/logging;
- Python API 细节见 /reference/python-api。
程序内计时:time_us() / time_ns()
在 CIN 程序里直接打点。time_us() 返回单调微秒计时,time_ns() 是纳秒版本(更高分辨率);两者的实现是引擎侧系统调用(SYS 138/139),不受 --seed 影响。
function main() -> int {
int t0 = time_us()
int sum = 0
for (int i = 0; i < 1000000; i++) {
sum += i
}
int t1 = time_us()
println("耗时 " + int_to_str(t1 - t0) + " us, sum = " + int_to_str(sum))
return 0
}用法要点:
- 先 warm 再测:首次运行包含编译/装载开销;把被测代码放进函数、循环里多次执行取平均更稳;
- 纳秒粒度:极短代码段用
time_ns(),避免整数微秒截断成 0; - 挂钟时间:日历时间用
time_ms()(毫秒级时间戳),不要拿它算耗时。
防止失控:外部超时
--max-instructions 在 v7.22.10 已弃用(仅作为隐藏参数保留),默认不限制指令数, 不再建议用它来兜底:
# 旧写法 (仅兼容旧脚本; 默认不限制)
codecin bench.cin --max-instructions 10000000批处理/判题请优先用外部超时(如 timeout 10 codecin bench.cin),避免依赖已弃用选项。 步数统计仍可通过 stats.instruction_count 读取。
确认运行环境:--build-info
性能结论只在"确实跑在 Go 原生引擎上"时才有意义。发布/部署前先做一次环境自检:
codecin --build-info它打印版本号、平台与原生库加载状态等环境信息(由 codecin/version.py 的 build_info() 生成,永不抛异常)。若动态库缺失或 ABI 不匹配,运行程序会直接抛 CPUSimulatorError 并附重建指引(codecin/native/build.ps1 / build.sh)——v5.9.0 起没有解释器回退,构建方法见 /dev/build-native。
引擎侧只有 steps 一项计数
原生引擎随结果回传的唯一执行统计是 steps(执行的指令数),由 Python 侧一次性写入 CPU.stats:
stats.instruction_count= 引擎返回的步数;- 逐操作码直方图等细粒度统计不再收集(直方图为空,计数集中在占位项)。
需要更细的性能归因(哪段代码慢)时,用上面的 time_us()/time_ns() 在程序内分段打点,这是 v5.9.0 起唯一的逐段测量方式。