【问题标题】:Performance related to multiple for loops vs single for loop wrt getting data from multimap与多个 for 循环相关的性能与单个 for 循环 wrt 从 multimap 获取数据
【发布时间】:2020-06-24 10:24:07
【问题描述】:

以下是从多映射中获取数据并分配给 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
            }

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

【问题讨论】:

  • 您尝试过并且遇到过任何性能问题吗?
  • 实际上没有,但我需要知道,因为我从同事那里得到了一条评论,说多个 for 循环更昂贵且耗时。我需要知道这背后的真相。
  • 至少多个 for 循环是需要维护和理解的额外代码。如果您尝试修改多个循环逻辑,您将需要在多个地方进行更改,这样的代码很容易出错。
  • 好的,同意这一点,但是关于与任何输入相关的性能?
  • 我没有多次迭代容器。迭代器只从头开始一次。所以 N 对于这两种情况仍然是相同的。

标签: c++ performance memory data-structures compilation


【解决方案1】:

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

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

  • 无需额外的逻辑来确定要从多映射中提取的类型。

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

  • 为每个循环检查cnt &lt; indivi 的循环开销稍大。

  • pGetRoute 从头到尾分别访问 28 次,这使得它更有可能超过缓存限制并由于缓存未命中而导致访问速度变慢。

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

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 2012-11-18
    • 2018-01-20
    • 1970-01-01
    • 2017-03-01
    • 2011-04-28
    • 2020-07-10
    • 2017-09-19
    • 2012-08-06
    相关资源
    最近更新 更多