对象向量的优化向量似乎很慢

Optimization Vector of vector of object seems slow

本文关键字:向量 优化 对象      更新时间:2023-10-16

我正在创建一个多人视频游戏,我有一个服务器和一个客户端在运行。我想优化尽可能多的我可以在服务器上的进程。当我们同时从不同的客户端接收到太多的信息时,服务器会延迟。

我想和你核实一下我所做的是否可以优化,我觉得很容易。

代码完成了:

我们有一张地图:

std::vector< std::vector < caseMap > >  _map;

简单对象caseMap:

struct caseMap
{
    int                     areaId;
    bomb                    *bombs;
    Bonus                   *bonus;
    int                     underEffect;
    int                     effectOwnerId;
    std::list< player* >    players;
};

在这个操作之后,我们访问了大量的时间来映射case:(例如当玩家死亡时)

this->_map[pl->getPosY()][pl->getPosX()].players.erase(itp);
这是我的问题和解决方案:-我们可以只有一个向量而不是两个,并有一个小公式来检索我们正在寻找的实际情况。

但是像我现在这样使用它是不是很重呢?我认为通过[]访问是一个大0常量,所以它不应该超重。

我可以在某些地方使用const引用吗?

我应该使用一个不同的对象,比如std::map吗?

我有点困惑,如果你们能刷新我对c++代码的大脑。谢谢:)

对于std::vector,查找时间总是恒定的。这个常数很小。添加更多的元素到向量是O(1)平摊时间,正如在评论中指出的那样。但请注意,最坏的情况追加时间是O(n)。这通常不是一个问题。如果您知道需要更多的空间,可以通过调用std::vector::reserve()来预先分配空间,使其稍微快一些。但这通常也是一个不必要的优化。

std::mapO(ln(x))的查找和插入时间,所以在大多数情况下会更慢。

如果您有性能问题,此查找不是原因。您应该保持这段代码不变。尝试做一些花哨的事情可能会导致代码变慢和维护混乱。

"过早优化是万恶之源"——Donald Knuth

请参阅问题whats-the-best-free-c-profiler-for-windows,了解用于分析代码的几个选项。完成代码。然后对其进行分析,并集中精力优化重要的部分。

另一个好的引用:

"把事情做好。那就快一点。"

这对年轻程序员和一些老程序员来说都是最难学的一课。你认为你在做正确的事情,真的让代码变得很棒,但你大部分时间都在旋转轮子优化那些无关紧要的东西,并创造未来的代码维护问题。