首页 > 解决方案 > 与多个 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
            }

我想使用多选项方案,因为它适合我的编码方案。但需要知道它是否有与之相关的缺点。

标签: c++performancememorydata-structurescompilation

解决方案


性能是否存在显着差异只能由您来回答,通过实际测量将使用此代码的执行环境中的性能。

在我看来,这是一种权衡。28 个独立的 for 循环的好处:

  • 没有额外的逻辑来确定从多地图中提取的类型。

关于 28 个独立的 for 循环的坏处:

  • 对每个循环进行稍大的循环开销检查cnt < indivi

  • pGetRoute 从头到尾被访问了 28 次,这使得它更有可能超过缓存限制并由于缓存未命中而产生更慢的访问。

  • 28 个单独的 for 循环更难维护或修改。通常,我认为这优先于上述最可能无关紧要的性能问题。但同样,只有您可以确定是否真的如此。


推荐阅读