使用QStrings作为密钥的QHash查找速度

时间:2010-04-26 13:18:22

标签: c++ qt hash qt4 performance

我需要在QImage上绘制动态叠加层。叠加的组成部分以XML定义,并解析为QHash<QString, QPicture>,其中QString是名称(例如“十字准线”),QPicture是独立于分辨率的绘图。然后,我在运行时确定的位置处绘制叠加的组件。

示例:我的QHash中有10张图片,构成了HUD中的每个可能元素。在特定的视频帧期间,我需要在图像的不同位置绘制其中的6个。在下一帧期间,某些事情发生了变化,现在我只需要绘制其中的4个,但其中有2个已经改变了。

现在问我的问题:如果我想快速完成这项工作,我是否应该将我的QHash重新定义为QHash<int, QPicture>并枚举键以抵消字符串比较造成的开销;或者这些比较不会对绩效产生很大影响?我可以很容易地转换为整数键,因为XML解析器和叠加组合器是完全独立的类;但我想在整个应用程序中使用一致的数据结构。

为了提高性能,我是否应该克服我对一致性和可重用性的渴望?如果我这样做会非常重要吗?

2 个答案:

答案 0 :(得分:6)

Gareth当然有正确的答案。我想稍微扩展一下。

  1. 寻求一致性和可重用性 第一。尽量不要介绍巨大的 性能瓶颈;它的 难以取得平衡
  2. 设置实际的效果标准。我猜你正在制作类似游戏的东西,合理的标准是“在我的开发机器上维持25 fps”
  3. 您的申请是否符合标准?是?足够的优化,转到5。
  4. 分析您的应用程序,优化占用时间最多的部分。回到3。
  5. 利润!
  6. 回到你的具体问题,如果哈希表中的元素数量小于或大约为100,那么密钥类型可能根本不重要。

答案 1 :(得分:5)

答案是您应该分析您的应用。只有当您发现字符串比较成为瓶颈时,才应实施替代策略。过早优化可能是浪费时间。

首先,确保程序的正确性,即确保它通过所有单元测试。 (我假设正确性和性能是正交的 - 这通常是一个合理的假设,除非您编写一个硬实时应用程序)然后,基准测试以确定性能是否符合您的要求。只有当基准测试显示性能太低时,才应优化,然后按照分析器的指导进行。通过重新运行单元测试,可以检查您所做的任何优化是否正确。