【问题标题】:Delphi - Memory usage and passing Classes as Var parametersDelphi - 内存使用情况并将类作为 Var 参数传递
【发布时间】:2015-10-09 12:31:08
【问题描述】:

德尔福 XE6。我正在为 Excel 编写一个 COM 插件(使用 Add-In Express)。我遍历所有行,读取给定的列,这是一个企业名称。然后,我使用自己的算法尝试在数据库中匹配此名称,如果可以匹配名称(又名芝加哥大学与芝加哥大学等),则更新电子表格的其余列。程序编译并运行。我的问题是,在某个点之后,它会显着减慢。

例如,我有 1000 行数据。我将此数据复制了 6 次,在我的电子表格中生成了 6,000 行。我平均每 50 行处理一次。最多 3600 行,平均每行 450 毫秒。始终在 3600 行时,平均值跃升至(并保持)在每行 4200 毫秒的范围内。

我一直在寻找内存泄漏,使用

ReportMemoryLeaksOnShutdown:=True; 

没有找到。它是每 1000 行完全相同的数据,因此它与数据无关。我正在运行 64 位 Windows (8.1),虽然是 32 位 Excel 和 32 位编译的 dll。我检查了我的应用程序正在使用的内存(使用 GetProcessMemoryInfo)...它可能从 120MB 开始,并在整个过程中上升 4-5 MB。它以 60-80K 的增量跳跃。

我尝试过每 200 行保存一次 Excel 电子表格,但这没有任何区别。

我的匹配算法使用 RegEx,所以我尝试使用外部 RegEx 库。那没什么区别。我现在正在用 AnsiStartsText 而不是 Regex 重写匹配例程...

我觉得我正在研究某种内存问题。我正在使用我创建的类。此类称为 AccountSearch。它有一个称为 AccountCriteria 的后代类,以及一个称为 HITS 的对象 TLIST(也就是被评分的可能性)。我在各种功能和程序之间传递这些信息。将类作为参数传递时是否有任何独特的问题?实际上,它们被视为 VAR 参数,不需要解决额外的内存问题,对吗?它们不会被复制,用作参数时不会使用额外的内存,对吗?

还有什么我应该看的吗?

【问题讨论】:

  • 您需要进行一些分析。从这里得到诊断的可能性很小。
  • @@David,你能评论一下将类作为参数传递的问题吗?
  • 类是引用类型。所以是的,给定AObject: TObjectAObject 只是一个指向对象的指针。
  • 如果您将 Add-In Express 放在一边并创建一个执行相同操作的 Excel 自动化应用程序,您是否会遇到同样的减速?如果您发布您的实际代码,读者会更好地发表评论并提供帮助。

标签: performance delphi memory


【解决方案1】:

对象是通过引用传递的,是的。

由于您正在创建一个 COM 插件,并且使用的是旧版本的 Delphi,因此您需要确保您没有被 OLE 引用泄漏错误所困扰。这些不会在关机时报告为内存泄漏,因为它们并不是真正的内存泄漏:

https://marc.durdin.net/2012/07/understanding-and-correcting-interface-reference-leaks-in-delphis-vcl-olectrls-pas/

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多