[英]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.