[英]Optimization Vector of vector of object seems slow
我正在创建一个多人视频游戏来玩,我有一个服务器和一个客户端正在运行。 我想尽可能多地优化服务器上的过程。 当我们同时从不同客户端接收大量信息时,服务器会出现延迟。
我想和你核实一下我所做的是否可以优化,我觉得很容易。
我们使用代码:
我们有一张地图:
std::vector< std::vector < caseMap > > _map;
一个简单的对象 caseMap :
struct caseMap
{
int areaId;
bomb *bombs;
Bonus *bonus;
int underEffect;
int effectOwnerId;
std::list< player* > players;
};
在此操作之后,我们有很多时间来映射案例:(例如当玩家死亡时)
this->_map[pl->getPosY()][pl->getPosX()].players.erase(itp);
这是我的问题和解决方案: - 我们可以只有一个向量而不是两个,并且有一个小公式来检索我们正在寻找的实际案例。
但是像我现在这样使用它很重吗? 我认为通过 [] 访问是大 O 常数,所以它不应该是超重的。
我可以在某个时候使用一些常量引用吗?
我应该使用不同的对象,例如 std::map 吗?
如果你们能在 C++ 代码上刷新我的大脑,我有点困惑。 谢谢 :)
使用std::vector
查找时间总是恒定的。 并且常数非常小。 正如评论中指出的那样,向向量添加更多元素是O(1)
摊销时间。 但请注意,最坏情况的追加时间是O(n)
。 不过,这通常不是问题。 如果您知道您需要的空间比通过调用std::vector::reserve()
预分配的空间多以使其稍微快一些。 但这通常也是不必要的优化。
std::map
具有O(ln(x))
查找和插入时间,因此在大多数情况下它会更慢。
如果您遇到性能问题,则此查找不是原因。 您应该保留此代码原样。 尝试做一些花哨的事情可能会导致代码变慢和维护混乱。
“过早的优化是万恶之源”——Donald Knuth
请参阅问题whats-the-best-free-c-profiler-for-windows以了解用于分析代码的多个选项。 完成你的代码。 然后对其进行分析并专注于优化重要的部分。
另一个很好的报价:
“把它做好。然后让它快点。”
这是年轻程序员和一些老程序员最难学习的课程之一。 你认为你在做正确的事情并且真的让代码变得很棒,但你主要是在旋转你的轮子来优化那些并不真正重要的东西并创造未来的代码维护问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.