我正在创建一个有趣的多人视频游戏,我有一台服务器和一个客户端正在运行。 我想尽可能多地优化服务器上的进程。当我们同时收到来自不同客户的大量信息时,服务器会滞后。
我想和你确认一下我所做的事情是否可以优化,我觉得很容易。
我们使用代码:
我们有一张地图:
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);
有我的问题和解决方案: - 我们只能有一个向量而不是两个,并且有一个小公式来检索我们正在寻找的实际案例。
但是,按照我现在的方式使用它是否很重要?我认为通过[]访问是一个很大的常数,所以它不应该超重。
我可以在某些时候使用一些const引用吗?
我应该使用其他对象,例如std :: map?
如果你们可以在c ++代码上刷新我的大脑,我有点困惑。 谢谢:))答案 0 :(得分:0)
使用std::vector
时,查找时间始终是不变的。而常数非常小。向量中添加更多元素是O(1)
摊销时间,正如评论中指出的那样。但请注意,最坏情况的附加时间是O(n)
。但这通常不是问题。如果您知道自己需要更多空间,可以通过调用std::vector::reserve()
来预先分配它,以使其更快一些。但这通常也是一种不必要的优化。
std::map
有O(ln(x))
个查找和插入时间,因此在大多数情况下会更慢。
如果遇到性能问题,则查找不是原因。您应该保留此代码。尝试做一些奇特的事情可能会导致代码变慢和维护混乱。
&#34;过早优化是所有邪恶的根源&#34; - 唐纳德克努特
有关分析代码的几个选项,请参阅问题whats-the-best-free-c-profiler-for-windows。完成你的代码。然后对其进行分析并集中精力优化重要的部分。
另一个好主意:
&#34;做对了。然后快点。&#34;
对于年轻的程序员来说,这是最难学的课程之一,也是一些旧的程序员。您认为自己正在做正确的事情并且真正使代码变得非常棒但是您通常会在优化不重要的事情并创建未来的代码维护问题。