【问题标题】:Why is copying pairs slower than copying structs? [closed]为什么复制对比复制结构慢? [关闭]
【发布时间】:2021-03-22 10:45:37
【问题描述】:

我想向我的团队展示为什么移动语义可以节省资源。所以我写了一些代码来获得一些演讲的数字。然而,在这项工作中,我发现了一些我没有完全理解的有趣的东西。复制对的向量比复制等效结构的向量花费的时间要长得多。 任何想法为什么?

输出:

std::pair<int,int>
===============
- sizeof type: 8
- sizeof container: 16
- copy = 80392 microseconds
- move = 6 microseconds

PAIR
====
- sizeof type: 8
- sizeof container: 16
- copy = 6377 microseconds
- move = 8 microseconds

代码:

#include <iostream>
#include <vector>
#include <chrono>

template <typename T>
void
MoveCopyComp()
{
    std::vector<T> list;
    T dummy;
    std::cout << "- sizeof type: " << sizeof(T) << "\n";
    std::cout << "- sizeof container: " << sizeof(list) << "\n";
    for (int num = 0; num < 1000000; ++num)
        list.push_back(dummy);

    auto t0 = std::chrono::steady_clock::now();
    std::vector<T> copy = list;
    auto t1 = std::chrono::steady_clock::now();
    std::vector<T> movement = std::move(list);
    auto t2 = std::chrono::steady_clock::now();
    std::cout << "- copy = "
              << std::chrono::duration_cast<std::chrono::microseconds>(t1 - t0).count()
              << " microseconds\n";
    std::cout << "- move = "
              << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()
              << " microseconds\n";
}

struct PAIR
{
    int a;
    int b;
};

int main(int argc, char **argv)
{
    std::cout << "std::pair<int,int>\n===============\n";
    MoveCopyComp<std::pair<int,int>>();
    std::cout << "\nPAIR\n====\n";
    MoveCopyComp<PAIR>();
}

【问题讨论】:

  • 我不熟悉复制与移动的来龙去脉。复制不需要调用构造函数,而移动和复制结构都不需要吗?
  • 这是一个完全优化的构建吗?您还在太短的时间内进行基准测试,以至于没有统计意义。您应该让测试至少运行一分钟,以解决由于缓存问题或 CPU 节流而导致的 CPU 性能短暂爆发。颠倒顺序会影响结果吗?
  • 你的构建命令行是什么。您必须处于优化的构建中才能获得有意义的结果。
  • 使用 --std=c++17 -O2 标志编译代码并将循环大小增加到 10000000,我得到以下结果:pair -- 53407 微秒,PAIR -- 64563 微秒
  • 使用 -O2,当平均运行超过 100 或 1000 次时,std::pair 的时间始终减少 10% 左右,即使使用您的小向量也是如此。在少数情况下(其中 2-5%)pair 速度较慢,但​​这可以通过程序外部的因素来解释,例如操作系统调度和硬件。确定这 10% 是否是实际差异需要进一步调查。

标签: c++ performance struct move std-pair


【解决方案1】:

哦,掌心! Mike Vine 击中了 shnoz。 我正在使用我的调试构建设置并且没有进行优化。

这是我对相同代码的优化结果:

std::pair<int,int>
===============
- sizeof type: 8
- sizeof container: 12
- copy = 2388 microseconds
- move = 0 microseconds

PAIR
====
- sizeof type: 8
- sizeof container: 12
- copy = 2672 microseconds
- move = 0 microseconds

感谢大家的cmets :)

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 2020-01-20
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2012-11-19
    • 2011-11-11
    相关资源
    最近更新 更多