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

时间:2016-05-25 16:50:11

标签: 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;

}

1 个答案:

答案 0 :(得分:5)

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

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

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

当然,从理论上讲,从排序的vector访问值比unordered_map更慢。但就性能而言,这是给予和接受的。快速复制或快速访问;哪个对你很重要?虽然即使是快速访问也是理论上的,但主要是当这些地图时。