You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实测浮点加法速度快于整型,是否存在问题?

核心原因分为两类:你的基准测试代码存在缺陷、你对运算速度的认知已经不符合现代CPU的特性

一、基准测试代码的问题

  • 存在编译器过度优化的风险
    你的两个测试函数逻辑完全可以在编译期求值,只要开了O2及以上优化,编译器会直接计算出最终返回值,完全删除掉循环逻辑。你实际测到的只是函数调用、计时函数本身的开销,和循环内的加法运算完全无关。
    更麻烦的是整型加法溢出属于C++未定义行为,只要NUM_ITERS足够大,编译器可以对int_plus做任意激进优化,比如直接返回任意值、甚至直接删除整个函数调用,这会直接导致整型测试的计时结果完全失真,而单精度浮点溢出有明确定义(会得到Inf),编译器的优化限制更多,两者的优化程度不对等。
  • 你测试的是运算延迟而非吞吐量
    你的循环逻辑是x += i,每一次加法都依赖上一次x的结果,属于典型的依赖链测试,最终得到的是加法运算的延迟(latency),而非单位时间能执行的最大运算量(吞吐量)。现代CPU的加法器普遍具备多发射、乱序执行能力,实际业务中很少存在这种全依赖的加法场景,这个测试结果本身参考价值就很低。
  • 计时逻辑存在单位错误
    chrono::high_resolution_clock的count()返回值单位由实现决定,你直接除以1000的计算逻辑是错误的,虽然两组测试用了同样的计算方式,相对比例不会受影响,但绝对数值没有意义。

二、你的认知不符合现代CPU的特性

10年前的老CPU确实普遍存在浮点运算速度慢于整型的情况,但近10年的x86、ARM架构CPU中,标量单精度浮点加法的延迟、吞吐量和整型加法已经完全一致:
常见桌面级x86 CPU的整型、单精度浮点加法延迟都是1时钟周期,吞吐量都可以做到每周期执行3~4次加法,你测试得到的浮点速度略快的差异,本质是基准测试误差导致的,两者实际运算速度处于同一水平,不存在谁明显快于谁的情况。

修正方案

  • 给测试函数的入参加volatile修饰,或者在循环内插入编译器屏障,避免编译器把循环逻辑优化掉
  • 构造无依赖的加法运算测试吞吐量,或者明确说明你测的是运算延迟
  • 开启O2优化,并且关闭CPU调频、后台进程等干扰因素,多次测试取平均值

内容的提问来源于stack exchange,提问作者dmitrenkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:27:00