QHash序列化性能

时间:2015-10-18 07:29:06

标签: c++ performance qt serialization

我正在用Qt编写一个相当天真的SSTable实现。一切都按照承诺的方式工作,读/写/更新/删除操作很好地扩展,但我发现了一个瓶颈,它是将表解析到内存并将内存刷新到磁盘的索引。

我用它作为灵感:https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/

使用磁盘上的压缩SSTable,在运行时使用QDataStream解析为内存MemTable,并使用TableIndex下的QHash<QString,qint32>进行访问罩。

现在,在进行一些早期的性能测试时,我发现解析百万个条目的表大约需要2秒钟,并且表格大致相同。通过进一步检查,表本身(正在QByteArray)在我的计算机上大约40ms被刷新并且在400ms下启用压缩,因此单独存储索引需要两次1.5秒以上。原因是QHash实际上在序列化时被迭代访问,并且在反序列化时被重建,因此为每个显然非常昂贵的密钥调用qHash

我尝试过:

  • 将密钥更改为QByteArray而不是QString会略有帮助,但同时也会降低查找性能(无论如何这都是闪电般快速的,所以并不是什么大问题。)
  • 将哈希序列化为两个QList个对象并手动重建。虽然序列化更快,但重建需要更长的时间,因为在反序列化QList之后,需要对它们进行迭代并通过各个键值对输入QHash

我没有尝试过:

  • 编写我自己的哈希类因为我怀疑我会做得更好(即至少是体面的红黑树查找和其他优化......)甚至可以与QHash相媲美。但是我可以做到这一点,以便(另一方面)(de)序列化更容易,更快。

我很感激如何解决这个问题,特别是如果有一个我可以使用的技巧我在Qt中不知道和/或如何在不疯狂的情况下自己做哈希。

0 个答案:

没有答案