如何将两个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
相关产品推荐
相关产品推荐

