【问题标题】:Is it worth caching objects created by Delphi's Memory Manager?是否值得缓存由 Delphi 的内存管理器创建的对象?
【发布时间】:2026-01-17 04:20:06
【问题描述】:

我有一个创建和销毁数千个对象的应用程序。是否值得缓存和重用对象,还是 Delphi 的内存管理器足够快以至于多次创建和销毁对象并不是那么大的开销(与跟踪缓存相反)当我说值得时,我当然在寻找以提高性能。

【问题讨论】:

    标签: delphi memory-management


    【解决方案1】:

    根据最近的测试 - 如果对象创建成本不高(即不依赖于外部资源 - 访问文件、注册表、数据库...),那么您将很难击败 Delphi 的内存管理器。就是这么快。

    如果您使用的是最新的 Delphi,这当然适用 - 如果不是,请从 SourceForge 获取 FastMM4 并使用它来代替 Delphi 的内部 MM。

    【讨论】:

      【解决方案2】:

      内存分配只是您想要缓存的一小部分。您需要知道构造语义有效对象的全部成本,并将其与从缓存中检索项目的成本进行比较,而不仅仅是微基准:缓存效果(即 CPU 缓存)可能会改变运行时动态在一个真正的实时运行的应用程序中。

      或者换句话说,测量它并找出答案。如果你不测量,你就不是工程,只是猜测。

      【讨论】:

      • 我知道你是对的。我只是想知道是否值得在这方面进行基准测试,或者将精力集中在其他地方。顺便说一句,D2009 编译器中的新功能做得很好!!
      【解决方案3】:

      只有分析器会告诉你。在一个紧密的循环中尝试这两种方法,看看有什么结果:-)

      【讨论】:

        【解决方案4】:

        您绝对必须使用实际负载进行测量才能回答此类问题。根据这些对象中保存的资源、任何资源争用、构建成本、大小等,答案可能会让您感到惊讶,甚至可能会根据负载的性质而改变。

        如果不进行测量,通常很难确定性能问题的出处。

        【讨论】:

        • 我听到你在说什么。我只是想知道是否值得考虑分析这个区域!
        【解决方案5】:

        我认为这取决于您的对象在创建和销毁期间将执行的代码。 TObject.Create 和 TObject.Destroy 的影响通常可以忽略不计,并且很容易被缓存开销所抵消。

        您还应该考虑到对象在重用时的状态可能与刚创建后的状态不同。

        【讨论】:

          【解决方案6】:

          通常唯一的判断方法是尝试一下。

          如果当前的性能足够好,那么您就没有太多的呼声来尝试提高它了。但是,如果您遇到性能问题,那么一些缓存(或实际上是其他一些策略)可能会有所帮助。

          【讨论】:

            【解决方案7】:

            您还需要一些关于特定对象(实例)使用频率的统计信息。如果您定期引用同一组数据,那么缓存可能会真正提高性能,但如果访问分布在所有可能的对象上,那么您的缓存未命中率可能会太高,不值得。

            【讨论】: