我正在为C ++模拟框架编写API。我想在C#中使用此API。但是我在获取模拟中所有角色的位置时遇到了性能问题。我试着向你详细解释这个框架是如何运作的。
有一个模拟器类:
class Simulator
{
/// A list of the characters that are currently in the simulation.
std::vector<Character> characters;
/// A list of the path planning results for the characters currently in the simulation.
std::vector<PathPlanningResult*> pathPlanningResults;
/// A mapping from character IDs (which can be set externally) to their positions in the 'characters' and 'PathPlanningResults' lists (which always number from 0).
std::map<int, int> characterVectorPositions;
/** Finds and returns a pointer to the character with the specified ID.
* @param id The ID of the character to find.
* @return A pointer to the Character object that matches the given ID, or NULL if no such character exists.
*/
inline Character* getCharacter(int id)
{
std::map<int,int>::iterator findIt = characterVectorPositions.find(id);
if(findIt == characterVectorPositions.end()) return NULL;
return &characters[findIt->second];
}
/// Adds a character to the simulation, with the specified settings.
bool Simulator::addCharacter(const Point& pos, short layer, const CharacterSettings& settings, int id)
{
Character newCharacter(id, pos, layer, settings);
// add the character
characters.push_back(newCharacter);
// add an empty result
pathPlanningResults.push_back(NULL);
// add the ID mapping
characterVectorPositions.insert(std::pair<int,int>(id, characters.size()-1));
}
}
此类包含模拟中的所有字符对象。
有一个字符类,其中包含获取位置的方法:
class Character
{
/** Returns the current 2D position of the character on its current layer.
* @return The current position of the character.
*/
inline const Point& getPosition() const { return pos; }
}
Point对象包含X和Ycoördinate
还有一个API类API_simulator,它有两个获取字符位置的方法:
class API_simulator
{
extern "C" EXPORT_API double GetCharacterX(int charid) {
return simulator->getCharacter(charid)->getPosition().x;
}
extern "C" EXPORT_API double GetCharacterY(int charid) {
return simulator->getCharacter(charid)->getPosition().y;
}
}
当我在C#中使用此API时,一切正常。除非我在模拟器中添加了很多字符,我需要获取所有字符的位置。这很长,因为每个字符的每个X和Y坐标都必须在树结构中找到。 有没有更快的方法来一次获得所有角色的位置? 共享内存是解决方案吗?
答案 0 :(得分:2)
我不认为地图是瓶颈。它应该足够可扩展,因此通过地图查找每个字符的信息应该足够快,即使有几千个字符(这会产生10到15个查找)。 但是,如果你想要所有字符的坐标,你最好立即迭代右边的矢量,而不是通过每个字符的id查找偏移量。
答案 1 :(得分:0)
与输入的大小相比,它实际上取决于数据库的大小。
如果你要查看输入中的所有字符(N表示输入),并且每次都在数据库映射中找到它们(D表示数据库),那么它将花费你 O(NlogD) 操作。
您可以决定是否需要数据库中的所有字符,然后您可以遍历characters
向量,这将是 O(D)。
如果输入要大得多,您可以在地图或矢量中对输入进行排序,然后循环数据库,并将其与输入进行比较。 O(NlogN)用于排序+ O(DlogN)以遍历数据库。
答案 2 :(得分:0)
公开GetCharacterXY
API方法:这需要单个对数时间查找来获取(x,y)位置,而不是两次执行相同的查找< / p>
O(n log n)
,但应该更快尝试使用std::unordered_map
代替std::map
,除非您某处需要按ID排序的字符,因为这会给出常量时间而不是对数时间查找
O(n)
,但您仍在为每个 n 项目执行哈希查找使用线性扫描characters
而不是多次查找来公开一个返回所有(id,x,y)元组的方法,如Yochai所建议
O(n)
,可能是最快的(因为你为每个项目做了最少的多余工作)