C语言统计函数平均执行时间时每次记录值均为0如何解决?
执行时间统计为0的核心原因
- 测试规模远低于计时函数精度:你当前设置的待排序长度
n=10,选择排序处理10个元素的后缀数组耗时不足1毫秒,而多数系统上clock()函数的精度仅为1毫秒,单次执行的时钟周期差end - start为0,换算后时间自然为0。 - 循环逻辑存在错误:外层
for(i = 0; i < 2; i++)循环中,仅i=0分支会调用排序函数startSS,i=1时计时区间内没有执行任何有效代码,这部分的计时结果必然为0。 - 编译器优化消除无效调用:如果编译时开启了O2/O3等优化选项,编译器检测到排序函数的执行结果没有被后续逻辑实际依赖(排序后仅执行了数组重置),可能会直接删掉排序函数的调用,导致计时区间内无代码执行。
修复方案
- 放大测试规模:将
n调整到1000甚至更高的量级,让单次排序的耗时超过clock()的最小精度单位。 - 修复循环逻辑:如果是要对比两种排序算法,补充
i=1分支的对应排序逻辑;如果不需要双轮测试,直接删除外层的i循环即可。 - 避免函数被优化消除:可以在排序结束后取排序结果的某个值做简单运算,比如将排序后的数组元素累加后打印一次无关结果,让编译器判定该函数调用有实际作用,不会被优化删除。
- 短耗时函数统计技巧:如果确实需要统计小规模下的执行时间,可以在单次计时区间内循环调用1000次排序函数,再将总耗时除以1000得到单次平均耗时,比单次统计的精度高很多。
内容的提问来源于stack exchange,提问作者Ram Santiago
相关产品推荐
相关产品推荐

