9

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

4

7 回答 7

17

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

如果您使用的是最近的 Delphi,这当然适用 - 如果没有,请从SourceForge获取 FastMM4并使用它而不是 Delphi 的内部 MM。

于 2008-11-02T22:14:44.960 回答
15

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

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

于 2008-11-03T00:01:50.500 回答
6

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

于 2008-11-02T21:54:32.567 回答
3

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

如果不进行测量,通常很难确定性能问题在哪里。

于 2008-11-03T00:42:09.267 回答
1

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

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

于 2008-11-02T21:55:03.627 回答
0

通常唯一的方式告诉 - 是尝试它。

如果当前的性能足够,那么您没有太多的尝试来增加它。但是,如果您有性能问题,那么一些缓存(或者实际上是一些其他策略)可能会有所帮助。

于 2008-11-02T21:56:06.230 回答
0

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

于 2008-11-02T22:02:04.923 回答