Delphi 资源和代码缩减

Delphi 资源和代码缩减,delphi,memory,resources,Delphi,Memory,Resources,如何减少应用程序中的资源? 我已经尝试了很多技巧 我减少并重写代码,减少行号, 减少评论, 压缩了最后的EXE但这不是我想要的方式, 改进变量类型转换, 从应用程序内部删除图标BMP、JPG 我需要我的应用程序在最终EXE和一般资源消耗上尽可能小。 还有关于这个问题的好文章吗 感谢您使用内存分析器来实时查看运行时内存使用情况。我不会花任何时间删除注释,因为编译器会将它们删除 您可以从外部服务(如Amazon S3)引用您的图像。真的值得这么麻烦吗?我们不再生活在640KB的内存中 如果你想让你的

如何减少应用程序中的资源? 我已经尝试了很多技巧 我减少并重写代码,减少行号, 减少评论, 压缩了最后的EXE但这不是我想要的方式, 改进变量类型转换, 从应用程序内部删除图标BMP、JPG 我需要我的应用程序在最终EXE和一般资源消耗上尽可能小。 还有关于这个问题的好文章吗
感谢您使用内存分析器来实时查看运行时内存使用情况。

我不会花任何时间删除注释,因为编译器会将它们删除


您可以从外部服务(如Amazon S3)引用您的图像。

真的值得这么麻烦吗?我们不再生活在640KB的内存中


如果你想让你的EXE更小,那么就使用包和库的动态链接。这是最大的推动力。同时将所有资源(图像、声音)放入单独的DLL中。删除注释并将所有代码写在一行中不会保存任何内容。

在项目选项中关闭调试信息如何:

  • 没有调试信息
  • 没有运行时检查
  • 如有可能,减少使用外部装置的数量

但调试信息可能是一个主要杀手。

将程序多次使用的任何图像放入图像列表或TGraphic组件中,并将其放入数据模块。使用这些图示符将所有组件链接到图像列表。如果使用“对象检查器”将同一图示符添加到多个组件中,则最终会得到它的多个副本,从而增加加载时间以及可执行文件和工作集的大小。

不要自动创建所有表单,即使Delphi现在为您提供了选项,并在早期版本中无条件地对新表单执行此操作。仅创建主窗体,并使用以下(伪)代码显示模式对话框:

procedure TMainForm.OptionDialog(Sender: TObject);
var
  Dlg: TOptionDialog;
begin
  Dlg := TOptionDialog.Create(nil);
  try
    // prepare dialog
    if Dlg.ShowModal = mrOK then begin
      // apply changed settings
    end;
  finally
    Dlg.Free;
  end;
end;

这将缩短应用程序加载时间并减少总体资源使用,特别是对于具有许多控件的复杂对话框。

放下VCL并使用KOL和MCK:


这是一个彻底的、非常大的改变,但是会降低exe的大小。

通常来说,如果您想要更小的exe大小,那么就使用早期版本的Delphi。

我总是使用它来压缩exe文件。它工作完美,通常会导致因子2压缩。当然,禁用所有调试信息将有助于减少文件大小。

减少可执行文件大小(实际上,PE映像大小,因为这也适用于DLL)的一个不错的技巧,当不是问题时:

把搬迁信息放在外面

在Delphi中,您可以这样做:

// Remove relocation table (generates smaller executables) :
// (See http://hallvards.blogspot.com/2006/09/hack12-create-smaller-exe-files.html)
{$SetPEFlags 1} // 1 = Windows.IMAGE_FILE_RELOCS_STRIPPED

干杯

首先测量,然后优化。您的应用程序有多大?您希望它有多大

你担心

磁盘上application.EXE文件的大小?然后

  • 在上使用运行时包构建。您将获得一个微小的.EXE,但还需要分发.bpls
应用程序使用的RAM内存?然后

  • 关闭运行时包构建-链接器将忽略包中大多数未使用的部分
应用程序安装程序的大小?然后

  • 使用运行时包构建关闭
  • 使用Inno设置
  • 以上大部分建议是什么
安装后应用程序加上软件包/DLL的大小?然后

  • 使用运行时软件包关闭构建,并使用UPX

UPX和ASPack会产生很多麻烦,因为防病毒错误报警。卡巴斯基经常这样做

你指的是磁盘上较小的exe大小,而不是运行时内存使用情况,对吗?“一般资源消耗”对我来说意味着两者兼而有之,因为内存与Windows或gdi处理的计算机资源一样多,硬盘空间和处理能力。只有当一些应用程序和一整套程序的其他库都使用DLL时,使用DLL才能为您带来任何好处。从一个可执行文件中分离代码和资源可能有好处,但大小的减少或速度的提高并不在其中,这完全取决于他真正想要实现的目标。如果他想让用户在互联网上更新软件,那么你需要在单独的DLL中获得小的EXE文件(最常更改)和静态内容(图像等),通常不需要更改。实际上,当你发布它时,我刚刚发布了它。实际上,您可以动态链接到KOL/MCK(这有点棘手),并使您的EXE几乎为零!好啊如果您需要当前的nre功能。你是做什么的?没必要否决这个。这是一个非常有效的答案,即使你自己不能使用它。Inno安装程序仍然使用Delphi2和Delphi3编译,以达到最小的可执行大小。我们说的是10千字节,很容易。请在这里阅读“无需自我”,因为你自己在管理破坏。因此,将第一个代码行更改为读取Dlg:=TOptionDialog.Create(nil);这是一个更好的处理方法。这是一个偏好的问题,任何一种方式都不会造成伤害。我可以忍受额外的微秒,这将花费。在任何情况下,我都需要使用父窗体作为所有者,因为我的对话框基类中有代码将其集中在父窗体上。有关使用“nil”而不是“Self”的一些信息:@Andreas:我对那篇文章不太感兴趣。至少第10页解释的“双重释放的风险”是完全虚假的:如果我有一个表单的长时间运行的方法,其中的一个表单在Application.ProcessMessages中被释放,那么程序员比……双重释放动态创建的TTable有更大的问题。然后,对表单的所有访问都可能导致崩溃,即使在以nil作为所有者创建TTable时也是如此。在执行对象的某个方法时释放任何对象肯定不是一个好主意。除了
Project -> Options -> Compiler:
===============================
Optimization ON
Debug Information OFF
Local Symbols OFF
Reference Info OFF
Use debug DCUs OFF

Project -> Options -> Packages:
===============================
Build with runtime packages ON (but you will have to distribute your BPLs!)
Note to non-delphi folks:
a BPL is just a DLL, but with magic Delphi dust to make it easier to use.