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

如何将两个chrono::durations相除获取比例(阿姆达尔定律计算)

计算Chrono时长比例的正确方法(用于阿姆达尔定律)

直接对std::chrono::duration做除法或调用.count()后做整数除法,都会因为整数截断得到0,这是因为两者的运算都默认采用整数算术逻辑。要得到正确的浮点比例,需要将运算转换为浮点类型处理,以下是两种可行方案:

方案1:将count值转换为浮点类型计算

把其中一个时长的.count()结果强制转换为浮点类型(如double),触发浮点除法运算:

double frac = static_cast<double>(timeTakenPar.count()) / timeTakenSeq.count();

这里将分子转为double后,整个除法会以浮点规则执行,得到正确的比例值。

方案2:将duration转换为浮点类型后计算

把整数类型的duration转换为浮点版本的duration(如std::chrono::duration<double>),此时除法会返回浮点标量:

// 将纳秒级duration转换为double类型的duration
auto parFloatDur = std::chrono::duration_cast<std::chrono::duration<double>>(timeTakenPar);
auto seqFloatDur = std::chrono::duration_cast<std::chrono::duration<double>>(timeTakenSeq);

// 直接相除得到浮点比例
double frac = parFloatDur / seqFloatDur;

这种方式更贴合chrono库的设计,避免直接操作底层的计数值。

完整示例代码

auto seqStartTime = std::chrono::steady_clock::now();

// 不可并行代码段
// ...

auto parStartTime = std::chrono::steady_clock::now();
// 可并行的串行代码段
// ...
auto parEndTime = std::chrono::steady_clock::now();

auto timeTakenPar = std::chrono::duration_cast<std::chrono::nanoseconds>(parEndTime - parStartTime);

// 更多不可并行代码段
// ...

auto seqEndTime = std::chrono::steady_clock::now();
auto timeTakenSeq = std::chrono::duration_cast<std::chrono::nanoseconds>(seqEndTime - seqStartTime);

// 方案1实现
double fraction1 = static_cast<double>(timeTakenPar.count()) / timeTakenSeq.count();
// 方案2实现
auto parFloatDur = std::chrono::duration_cast<std::chrono::duration<double>>(timeTakenPar);
auto seqFloatDur = std::chrono::duration_cast<std::chrono::duration<double>>(timeTakenSeq);
double fraction2 = parFloatDur / seqFloatDur;

注意事项

  • 确保timeTakenSeq不为0,避免触发除以0的运行时错误;
  • 若需要更高精度,可使用long double替代double。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:20:21