【问题标题】:What is paging effect in C++?C++中的分页效果是什么?
【发布时间】:2009-10-19 03:03:29
【问题描述】:

我在尝试学习 C++ 中的数组和向量时遇到了this。帖子中提到的“分页效应”是什么?另外,只是为了检查我自己的理解,我认为向量使用更多时间是因为动态内存分配。我说的对吗?


补充问题: 但是vector<int> arr( 10000 ) 是不是已经有足够的内存来分配 10000 个 int 了?或者这样说,如果我所做的只是遍历每个元素并初始化它们,arr 还会增长吗?

【问题讨论】:

    标签: c++ performance arrays vector


    【解决方案1】:

    如果你使用 push_back(),Vector 使用动态分配,但你可以强制它使用 reserve() 预分配内存。

    已检查的构建(在调试库中很常见)还检查向量操作的边界,这会在调试模式下减慢它们的速度。发布版本不应比原始 C 慢。

    分页意味着当物理内存已满时将内存移出磁盘。如果您认为内存正在被分页,则必须小心计时。一种常见的技术是多次运行任务并拒绝最长的时间。

    编辑:为了提高效率,您应该(几乎)永远不要使用原始的“C”类型而不是 STL。编写 STL 的人都非常聪明,而且非常关心性能。如果使用得当,它永远不会比“C”差,而且通常会更好。使用 STL 算法而不是您自己的 han roll loops 也是如此。

    【讨论】:

    • 他已经提到了reserve()。此外,当对原始数组使用与向量相同的方法时,您还必须重新分配和复制。
    • 实际上,最近的研究证明,2 的增长因子实际上并不是那么好,而且任何指数增长因子实际上都满足了 STL 要求。事实证明 1.5 好很多,而且易于实现(m_capacity += m_capacity >> 1,相当快)
    • “编写 STL 的人都非常聪明,而且非常关心性能。如果使用得当,它永远不会比 'C' 差,而且通常会更好。”这根本不是我的经验——STL 的算法对我来说总是比定制的原生类型容器更糟糕。
    • @MSalters 您能否提供任何有关 1.5 生长因子与 2x 生长因子的论文或其他来源?只是好奇。很抱歉恢复这么老的话题..
    【解决方案2】:

    您链接到的页面指出优化消除了性能差异。这意味着它很可能是由向量中的额外函数调用引起的 - 您可以放心地忽略这些,因为优化器足够聪明,可以内联它们。

    海报使用了“分页效应”这个名称,但他们在向量案例中实际指的是内存分配的成本。此外,通过尝试对该内存进行写入/读取,他们将数组末尾的一个段拉入缓存,可能会提高该内存区域的未来性能。

    【讨论】:

      【解决方案3】:

      该代码的作者是强制的

      array[size - 1] = 0;
      

      访问以确保在运行其代码的主要部分之前已对数组缓冲区进行了至少一次访问。这样做是为了减轻使用虚拟内存交换文件的影响——访问增加了在主代码启动时缓冲区没有被换出到页面文件的可能性。如果没有这个,当第一次访问缓冲区时可能会发生交换,这会显着增加运行时间并导致错误的测量结果。

      只有在缓冲区大小不大于操作系统用于寻址虚拟内存的最小内存段大小时,这才会有保证的效果。

      这不是 C++ 特有的问题。

      向量也比较慢,因为访问它需要两次内存访问 - 一次检索缓冲区地址,另一次实际访问内存。对于 C 数组,缓冲区地址是已知的,只需要一次访问。如果使用临时存储缓冲区地址重写带有向量的相同代码,则它运行得更快。

      【讨论】:

      • (不是我的反对票)“两次内存访问”声明是完全错误的,关于 C++ 相对于 C 的速度的结论也是如此(无论您有 int* 还是 @987654323 @,如果它在堆栈上,则需要将基地址加载到寄存器中)。除了错误之外,它也与问题无关。
      • VC++ 在这种情况下会为向量发出“两次内存访问”代码。
      • 我认为他的观点是即使它是一个原始指针,它也会是两次内存访问。当然,如果整个数组都在堆栈上,这是可以避免的,但是动态分配的数组会像向量一样遭受额外的内存访问
      • 删除最后一段(...需要两次内存访问...)进行投票。
      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 2011-08-23
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2012-07-01
      相关资源
      最近更新 更多