使用运行时包构建时,如何使程序使用更少的内存?

时间:2010-11-07 14:50:04

标签: delphi packages bpl

我总是在没有“使用运行时包构建”的情况下编译我的delphi应用程序,但是对于我最新的Project我必须使用它(因为它开始逐日膨胀)。我使用了一些第三方VCL(带源代码的TMS组件包,源代码目录也在搜索路径中),

当我使用运行时包编译时,整个bpl包在运行时由app使用(否则它只包含应用程序内包中所需的vcl)所以我认为它消耗了很多ram内存(通常我的应用程序使用38 Mb ram但是现在62 Mb(不仅是我已经使用了很多其他vcl的tms),根据Windows任务经理的说法。

有没有办法让我的应用程序消耗低内存,就像编译为单个exe。

(我知道只需要vcl重新编译VCL包(我有源代码)但是挖掘源并找出所需的vcl和子程序太难了)

2 个答案:

答案 0 :(得分:8)

我认为你在测量错误的东西。虽然包文件更大,但这并不一定意味着您的程序在RAM中占用更多空间。编译器必须包含包中所有函数和单元的代码,无论给定程序使用哪个部分,但这并不意味着所有代码都被加载到内存中。操作系统将加载它需要的页面;其余的将继续驻留在磁盘上,来自它的BPL文件。整个BPL文件将占用地址空间,但它不会被加载到物理RAM中,因此除非您真的有使用整个2 GB地址空间的危险,否则不用担心操作系统授予您的流程。

答案 1 :(得分:0)

包是DLL,需要加载到内存才能工作。每个包都将包含它所构建的所有单元的代码。因此,他们可以使用比使用运行时包构建的exe更多的内存 - 尽管你的增加看起来有点太大了。另一方面,如果超过您的应用程序使用相同的软件包并且它们已正确安装,则它们的代码将被加载到内存中一次。 您可以构建ad-hoc软件包,但是您应该非常小心地使用标准软件包中的不同名称,否则您可能会破坏其他一些应用程序,特别是如果您将软件包放在共享位置或路径中的第一个目录中。 在尝试之前,我将检查您的应用程序是否未链接未使用的软件包。 Delphi将或多或少地提供它所知道的所有包。您可以在编译后检查哪些包真正使用,并将它们仅添加到要使用的包列表中。