为什么在C++中复制无序映射会变慢?

Ort*_*x92 2 c++

我正在ARM cortex A9上编写代码,用于实时机器人应用程序.我的中断遇到了一些时间问题.我正在将一个全局变量复制到中断中,在20kHz的中断上需要20us.这留给我大约40us的空闲..只需复制需要20us!

所以我的问题是为什么将无序地图复制到另一个无序地图需要花费这么多时间?

class Supervisor {
private:
    DispatchCommunication dispatchComm;
    DispatchLogic dispatchLogic;

    std::unordered_map<std::string, uint32_t> fetchedData;
public:
    void initialize(void);
    void communication(void);
    void logic(void);
};

inline void Supervisor::initialize(void) {
    dispatchComm.initialize();

    dispatchLogic.initialize();    
}

/**
 * Get all sensor data
 */
inline void Supervisor::communication(void) {

    // Create a map of the data we want to request from the communication dispatcher
    std::vector<std::string> requestMap = { "jointAngle", "motorAngle", "piggyback" };

    // Fetch the requested data
    fetchedData = dispatchComm.getDataVector(requestMap);


}

/**
 * Run all the logic
 */
inline void Supervisor::logic(void) {

    std::unordered_map<std::string, uint32_t> IRQFetchedData;

    // This part takes a whopping 20us!
    IRQFetchedData = fetchedData;

}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

在您的情况下,它不仅仅是复制地图.这std::string是在地图中复制s.这意味着(可能)大量的内存分配.即使没有这些分配(小字符串优化),它仍然需要大量复制字符串数据.

这完全取决于地图本身所需的复制,它涉及自己的一系列分配,基于存储桶大小,各种堆实现策略等.

如果你需要快速复制,那么排序vector可能更合适,而不是unordered_map.这对string复制问题没有帮助,但它可以帮助复制地图本身的成本.您甚至可以通过使用固定长度的字符串类来加快速度,这可能很容易复制.这可能会使整个vector单个内存分配后跟一个内存分配memcpy.

当然,从理论上讲,从排序中访问值vector比从中获取值要慢unordered_map.但这就是性能方面的让步.快速复制或快速访问; 哪个对你很重要?虽然即使是快速访问也是理论上的,但主要是当这些地图很大时.