c++ - 在 C++ 中反序列化树的最快方法是什么

标签 c++ performance qt serialization tree

我正在使用用 C++ 实现的一个不太小的树结构(它是一个 Burkhard-Keller-Tree,内存 > 100 MB)。指向每个节点的子节点的指针存储在 QHash 中。

每个节点 x 有 n 个子节点 y[1] ... y[n],到子节点的边标记为编辑距离 d(x, y[i]),因此使用散列来存储节点是一个显而易见的解决方案。

class Node {
    int value;
    QHash<int, Node*> children;
    /* ... */
};

我也想把它序列化和反序列化成一个文件(我目前使用的是QDataStream)。树只构建一次,之后不会改变。

构建树并将其反序列化相当缓慢。我正在以明显的方式加载树:递归构建每个节点。我认为这是次优的,因为许多节点是使用 new 运算符单独创建的。我在某处读到 new 非常慢。初始构建不是大问题,因为树相当稳定,不需要经常重建。但是从文件加载树应该尽可能快。

完成此任务的最佳方法是什么?

将整棵树保存在具有相邻节点的单个内存块中一定会好得多。然后将减少序列化和反序列化以保存和加载整个 block ,我只需分配一次。

但要实现这一点,我必须重新实现 QHash,AFAIK。

你会做什么来加速反序列化?

附录

感谢您建议进行一些分析。以下是结果:

从文件重建树时

 1 % of the time is consumed by my own new calls
65 % is consumed by loading the QHash objects (this is implemented by the 
     Qt Library) of each node
12 % is consumed by inserting the nodes into the existing tree
20 % is everything else

因此,导致延迟的绝对不是我的新调用,而是在每个节点重建 QHash 对象。这基本上是通过以下方式完成的:

 QDataStream in(&infile);
 in >> node.hash;

我是否必须深入研究 QHash 并查看其中发生的事情?我认为最好的解决方案是一个哈希对象,它可以通过单个读写操作进行序列化,而无需重建内部数据结构。

最佳答案

首先 - 分析您的应用程序,以便您知道什么需要时间 - 将怀疑基于新的,因为您已经在某处阅读它可能很慢或通过树的迭代是不够的。

这可能是 IO 操作 - 也许您的文件格式不正确/效率低下。

也许你只是某处有缺陷?

或者也许在某个地方有一个您不记得导致问题的二次循环? :)

衡量在您的案例中真正需要花费时间的事情,然后解决问题 - 这会为您节省大量时间,并且您会避免破坏设计/代码以修复在找到真正原因之前不存在的性能问题.

关于c++ - 在 C++ 中反序列化树的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1913767/

相关文章:

c++ - NS-3 自载网络 : How to implement simple intersection scenario?

Python:这是比较和排序字符串列表的低效方法吗?

objective-c - 通过 __block 与不通过 __block 捕获 block 中的外部变量的性能差异

performance - Spring +卡夫卡: Transactions slow

c++ - 从 QObject 继承类中的 winsock 连接函数

c++ - 如何使用 CMake 项目调试 QML

c++ - valgrind:地址 0x5111715 处无法识别的指令

c++ - 这是静态多态性的 CRTP 用法,但没有实现派生函数。在 gcc 和 visual studio 中编译。为什么?

c++ - 我的 C++ 函数在不应该的时候破坏了变量

qt - 如何在 PySide/PyQt 中撤消 QStandardItem 的编辑?