如何正确比较多种排序算法的执行时间?附测试问题与需求
背景
问题源自Stack Overflow相关提问,我曾尝试对比多种排序算法的执行时间,但操作中出现了诸多问题 :)
任务目标
当前我的目标是对比多种排序算法的执行时间,并针对不同大小的数组收集统计数据。假设我有4种不同的算法,需要在3个不同大小的随机生成int数组上测试它们的执行时间。
此前问题中被指出的若干问题:
- 分支预测失效(missed branch prediction):分支预测对代码性能影响极大
- 过多源码文件阻碍部分优化
- 在禁用优化的情况下讨论性能毫无意义
- 在同一进程中运行多个基准测试存疑
- 冷/热缓存(cold/hot cache)问题
- 操作系统实际执行动态内存分配的时机与方式
我查阅资料后针对这些问题整理了一些解决方案:
- 分支预测由处理器控制,我无法直接干预(虽可将
if/else转换为特殊写法避免,但我不会这么做) - 若确有必要,可将所有代码整合到
main.c中,但我更倾向于拆分文件以便维护 - 我使用
CLion,已找到添加优化标志的方式:set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -O3)(若有误请指正) - 若必须分开,可为每个算法编写独立
*.c文件,但这样难以保证数组一致,或许可从文件读取数组以保证公平性 - 针对缓存问题,我理解只需重复运行多次测试(若理解有误请指正)
- 我不清楚如何处理动态内存分配问题,或许可在函数栈上定义数组以避免溢出? :)
可能还存在其他未知问题,是否有能解决大部分问题的规范方法?
是否有现成的此类测试模板?
若能在假设所有算法已实现的前提下提供示例代码,我将十分感激
以下是相关环境信息:
- 操作系统:Windows 10
- 编辑器:CLion
CMakeLists.txt配置:cmake_minimum_required(VERSION 3.29) project(Test C) set(CMAKE_C_STANDARD 23) set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -O3) add_executable(Test main.c sorting-functions/bubble_sort/bubble_sort.c sorting-functions/bubble_sort/bubble_sort.h utils/swap/swap.c utils/swap/swap.h utils/print_arr/print_arr.c utils/print_arr/print_arr.h sorting-functions/bubble_sort_2/bubble_sort_2.c sorting-functions/bubble_sort_2/bubble_sort_2.h utils/copy_arr/copy_arr.c utils/copy_arr/copy_arr.h )
内容的提问来源于stack exchange,提问作者EzioMercer
相关产品推荐
相关产品推荐

