c++ - 与多个 for 循环相关的性能与从 multimap 获取数据的单个 for 循环相关的性能
问题描述
下面是从多映射中获取数据并分配给 typedef 结构的示例代码。我需要知道与单个 for 循环相比,使用多个 for 循环获取数据是否存在任何性能差异/优势/劣势。这里 dbR25GetRoute 是多图。
int sz = dbR25GetRoute.size();
int indivi = sz/28;
if(!pGetRoute && (0 < indivi)) {
pGetRoute = new R25GetRoute[indivi];
}
if(pGetRoute) {
typename DBMULTIMAP::const_iterator iter = dbR25GetRoute.begin();
for (int cnt = 0; (iter != dbR25GetRoute.end()) && (cnt < indivi); iter++, cnt++) {
pGetRoute[cnt].costPrice = GetDBVal<double>(iter->second);
}
for (int cnt = 0; (iter != dbR25GetRoute.end()) && (cnt < indivi); iter++, cnt++) {
pGetRoute[cnt].access = GetDBVal<std::string>(iter->second);
}
..... total 28 for loops
}
而不是单循环
if(pGetRoute) {
typename DBMULTIMAP::const_iterator iter = dbR25GetRoute.begin();
for (int cnt = 0; (iter != dbR25GetRoute.end()); iter++, cnt++) {
T data = GetDBVal<double>(iter->second);
/// Call some functionality here to save T data
}
我想使用多选项方案,因为它适合我的编码方案。但需要知道它是否有与之相关的缺点。
解决方案
性能是否存在显着差异只能由您来回答,通过实际测量将使用此代码的执行环境中的性能。
在我看来,这是一种权衡。28 个独立的 for 循环的好处:
- 没有额外的逻辑来确定从多地图中提取的类型。
关于 28 个独立的 for 循环的坏处:
对每个循环进行稍大的循环开销检查
cnt < indivi
。pGetRoute 从头到尾被访问了 28 次,这使得它更有可能超过缓存限制并由于缓存未命中而产生更慢的访问。
28 个单独的 for 循环更难维护或修改。通常,我认为这优先于上述最可能无关紧要的性能问题。但同样,只有您可以确定是否真的如此。
推荐阅读
- django - Django .Reverse 用于“医生”,没有找到任何参数。尝试了 1 种模式:['doctor / (?P
[^ /] +) / $'] - flutter - Google Calendar API - 用户同意后跳过提示
- cmake - CMake如何添加标志仅用于编译,而不是链接
- python - 如何修复错误:找不到满足 uncompyle6-3.7.4-py3.8 要求的版本?
- matlab - 为什么 x 和 y 的卷积不同 ifft(fft(x)xfft(y))?
- regex - 正则表达式 - grep 起源/
除了原点/HEAD - c# - Firebase 消息传递在 Xamarin.Android 上工作缺少哪个 proguard 配置?
- java - Kotlin:接口作为方法参数
- node.js - 如何在 post Express 中获取请求正文?
- nest-device-access - 甚至测试智能设备 API 是否需要 OAuth 同意屏幕验证