Delphi - 内存使用并将类作为Var参数传递

时间:2015-10-09 12:31:08

标签: performance delphi memory

Delphi XE6。我正在编写一个COM PlugIn for Excel(使用Add-In Express)。我遍历所有行,读取给定的列,这是一个商业名称。然后,我使用自己的算法尝试在数据库中匹配此名称,如果我可以匹配名称,则更新其余的电子表格列(也就是芝加哥大学与芝加哥大学相同)。该程序编译并运行。我的问题是,在某一点之后,它会急剧减速。

例如,我有1,000行数据。我将这些数据复制6次,在我的电子表格中创建了6,000行。我平均每50行处理一次。最多3600行,平均每行450毫秒。一致地在3600行,平均跳跃到(并保持)在每行4200ms范围内。

我使用

查找了内存泄漏
ReportMemoryLeaksOnShutdown:=True; 

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

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

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

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

还有什么我应该看的吗?

1 个答案:

答案 0 :(得分:2)

对象通过引用传递,是。

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

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