0

由于性能问题,我正在尝试重构一些 C++ 代码,我想知道解决这个问题的最佳方法。我有一个类说 DataGatherer,它是大型系统的核心组件。此类被序列化并通过数据流发送,复制并存储到表中,为了并发而复制(签出副本而不是访问原始 DataGatherer 对象)。我列出示例只是为了让您知道它具有同时使用的复制和赋值运算符。

问题是 DataGatherer 对象可能变得非常大,因为它们本质上包含大量收集的数据以及有关数据的统计信息和元数据。在许多情况下,只需要统计数据和元数据,而不是后端数据收集。

是否有任何设计模式可能对这里有所帮助?也许更普遍的问题是,在大多数情况下您只需要对象的一部分,但对象内部耦合如此紧密以至于几乎不可能将其拆分时,您会怎么做?

我曾经的想法,

  • 将该类拆分为一个 DataGatherer 类和一个指向 DataGathererBackend 对象的指针。在大多数情况下返回浅副本以避免在不使用 DataGathererBackend 时复制它的所有开销。我讨厌这样做,因为当你想要一个浅拷贝与你想要一个深拷贝时处理所有的麻烦,而且只是一般的混乱形式不得不求助于 DataGatherer 对象,这些对象具有 NULL 指针作为后端对象,因为它不是在这些情况下需要。

  • 将该类拆分为 DataStatistics 和 Data,并创建一个包装并包含两者的第三个类。

  • 其他想法?

4

2 回答 2

1

一个选项是您可以执行 Copy On Write,其中复制构造函数或赋值运算符被重载以首先不复制(后端?)数据,引用它,并仅在修改数据时复制它。您可以在 DataGatherer 内部执行此操作,因此 iterface 不会更改,只要您可以重载数据修改成员即可。但是,如果您已经公开了指向数据的指针并在任何地方使用它,那就更难了。

于 2012-10-11T01:21:10.750 回答
1

如果只需要统计信息,那么您可以通过值或常量引用返回一个统计信息结构,并将检索从复制运算符更改为调用统计信息获取器函数。

于 2012-10-11T02:49:52.747 回答