我正在研究在我们的系统中使用QueryPerformanceCounter的确切含义,并试图了解它对应用程序的影响.我可以看到在我的4核单CPU机器上运行它需要大约230ns才能运行.当我在24核4 cpu xeon上运行它需要大约1.4ms才能运行.更有趣的是,在我的机器上运行多个线程时,它们不会相互影响.但是在多CPU机器上,线程会导致某种交互,导致它们相互阻塞.我想知道他们都在查询总线上是否有一些共享资源?当我调用QueryPerformanceCounter时它到底发生了什么?它真正测量了什么?
我似乎无法找到任何关于此的信息,所以我转向stackoverflow.在C++中std :: tr1 :: unordered_map的迭代器效率如何?特别是与列表迭代器进行比较.创建一个包含类的包装类是否有意义,它还包含列表中的所有键以允许有效的迭代(我的代码在unordered_map中使用了大量的迭代).对于那些会推荐提升的人,我不能使用它(无论出于何种原因).
对于内存使用比速度更重要的嵌入式系统应用程序,最好使用什么地图容器?std::map, std::unordered_map? 这适用于N小于例如一百的情况。
如果实现很重要,那么我关心的是 libstdc++ 实现(GCC)。
虽然我知道不可能在内存使用方面击败简单的数组,但我想避免使用具有 O(N) 性能的数据结构。因此,虽然我想减少内存占用,但我也希望查找速度合理(优于 O(N))。我不关心其他操作(插入、删除),因为它们很少发生。
如果我想进行自己的内存使用测量,我将如何在 Linux 平台上执行此操作?
将提振:: flat_map适合作为具有占地面积小和查找时间比O(n)的关联容器?
我需要映射常量大小的字符串,其中只包含字母数字值(AZ,0-9,没有小写字母)到其他字符串.unordered_map变得非常大(数千万个键),而映射的值来自几千个字符串的集合.在分析时,我发现大部分时间花在将新值插入地图(operator [])中,并且清除地图需要很长时间.
std::unordered_map<std::string, std::string> hashMap;
while (...){
...
hashMap[key] = value; // ~50% of program time is spent here
...
}
hashMap.clear(); // Takes a very long time, at this point hashMap.size() > 20,000,000
Run Code Online (Sandbox Code Playgroud)
我的想法是字符串分配/解除分配非常慢,以及散列和插入地图.有什么建议可以优化吗?请记住,密钥大小是常量,其内容限制为一组36个字符,并且映射的值来自有限集.我愿意使用除strings和unordered_map之外的不同容器/数据类型.
根据Baum Mit Augen的建议,我将我的密钥类型更改为无符号long long,并创建了将base 36转换为decimal的函数:
unsigned long long ConvertBase36(const char* num)
{
unsigned long long retVal = 0;
for (int i = 0; i < 12; i++)
{
unsigned int digit = 0;
char currChar = num[i];
if (currChar <= '9')
{
digit = …Run Code Online (Sandbox Code Playgroud) 有boost.container flat_map和其他人一样,Loki AssocVector和许多其他人都喜欢这些元素.
是否有现代(c ++ 11移动启用等)实现的未分类矢量适合作为地图/集?
我的想法是将它用于非常小的地图/集(少于20个元素)和简单的密钥(对于这些密钥,散列并不总是有意义)
c++ ×5
c++11 ×3
boost ×1
containers ×1
dictionary ×1
gcc ×1
iterator ×1
optimization ×1
stl ×1
timing ×1
winapi ×1
windows ×1