【问题标题】:EXE, Resource and Code ReductionEXE、资源和代码减少
【发布时间】:2009-01-06 10:35:04
【问题描述】:

如何减少应用程序中的资源? 我尝试了很多技巧 我有减少和重写代码,减少行数, 减少 cmets, 压缩了最终的EXE,但这不是我想走的路, 改进变量类型转换, 从应用程序内部删除图标、BMP、JPG 我需要我的应用程序在最终 EXE 和一般资源消耗上尽可能小。 任何更多的想法,关于这个主题的任何好文章 谢谢

【问题讨论】:

  • 您的意思是磁盘上的 exe 大小更小,而不是运行时内存使用量,对吧?
  • “一般资源消耗”向我表明他的意思是两者兼而有之,因为内存与窗口或 gdi 句柄、硬盘空间和处理能力一样多是计算机资源。

标签: delphi memory resources


【解决方案1】:

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

  • 没有调试信息
  • 没有运行时检查
  • 尽可能减少使用外部设备的数量。

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

【讨论】:

    【解决方案2】:

    我不会花任何时间删除 cmets,无论如何编译器都会将它们删除

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

    【讨论】:

      【解决方案3】:

      将程序多次使用的任何图像放入图像列表或 TGraphic 组件中,并将它们放入数据模块中。将使用这些字形的所有组件链接到图像列表。如果您使用 Object Inspector 将相同的字形添加到多个组件,您最终会得到它的多个副本,这会增加您的加载时间以及您的可执行文件和工作集的大小。

      【讨论】:

        【解决方案4】:

        relocation 不是问题时,减小可执行文件大小(实际上是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
        

        干杯!

        【讨论】:

        • 结合 Jim McKeeth 关于使用早期 Delphi 版本的提示:如果您的 Delphi 版本不支持 $SetPEFlags,则在最终可执行文件上使用 Jordan Russell 的 StripReloc.exe。在他的网站上查看jrsoftware.org/striprlc.php
        【解决方案5】:

        放弃VCL,使用KOL和MCK:http://kolmck.net/

        这是一个激进且非常大的变化,但会减小 exe 的大小。

        【讨论】:

        • 当你发布它时,我实际上只是在发布它。您实际上可以动态链接到 KOL / MCK(这有点棘手)并将您的 EXE 降到几乎没有!
        【解决方案6】:

        不要自动创建所有表单,即使 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;
        

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

        【讨论】:

        • 这里不需要自我,因为您自己管理破坏。因此将第一行代码更改为读取 Dlg := TOptionDialog.Create(nil);是更好的处理方式。
        • 这是一个偏好问题,无论哪种方式都不会造成伤害。我可以忍受这将花费额外的微秒。在任何情况下,我都需要使用父表单作为所有者,因为我的对话框基类中有代码将其集中在父表单上。
        • 一些关于使用“nil”而不是“Self”的信息:delphi.about.com/od/kbcurt/ss/dynamiccreateno.htm
        • @Andreas:我对那篇文章不太感兴趣。至少第 10 页上解释的“双重释放的风险”是恕我直言,完全是虚假的:如果我有一个长时间运行的表单方法,其中的表单在 Application.ProcessMessages 中被释放,那么程序员有更大的问题比...
        • 动态创建的TTable的double Free。对表单的所有访问都可能导致崩溃,即使在创建 TTable 时使用 nil 作为所有者也是如此。在执行其方法之一时释放任何对象肯定是个坏主意。除了“删除这个;”作为最后一行。
        【解决方案7】:

        先衡量,再优化。您的应用程序有多大,您希望它有多大?

        您是否担心...

        磁盘上应用程序 .EXE 文件的大小?那么……

        • 使用运行时包构建on。您将获得一个很小的 ​​.EXE,但还需要分发 .bpls。

        应用程序使用的 RAM 内存?那么……

        • 在关闭运行时包的情况下构建 - 链接器将忽略包中大部分未使用的部分。

        应用程序安装程序的大小?那么……

        • 使用运行时包构建关闭
        • 使用 Inno 设置
        • 上面的大部分建议?

        安装后应用程序 PLUS PACKAGES/DLLS 的大小?那么……

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

        【讨论】:

          【解决方案8】:
          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.
          

          This article may be useful to you.

          【讨论】:

          • Debug Information OFF Local Symbols OFF Reference Info OFF 这三个对EXE/DLL/BPL没有影响。信息仅存储在 *.dcu 和 *.dcp 文件中。
          【解决方案9】:

          这些麻烦真的值得吗?我们不再生活在 640 KB 内存时代。

          如果您希望 EXE 更小,请使用包和库的动态链接。这提供了大部分的推动力。还将所有资源(图像、声音)放入单独的 DLL 中。删除 cmets 并将所有代码写成一长行不会保存任何内容。

          【讨论】:

          • 只有在某些应用程序和可能一整套程序的其他库都使用它们的情况下,使用 dll 才能为您带来任何好处。从单个可执行文件中拆分代码和资源可能有好处,但减少大小或提高速度不在其中。
          • 这一切都取决于他实际想要达到的目标。如果他想让用户通过 Internet 更新软件,那么您希望在通常不需要更改的单独 DLL 中获取小的 EXE 文件(最常更改)和静态内容(图像等)。
          【解决方案10】:

          一般来说,如果您想要更小的 EXE 大小,请使用较早版本的 Delphi。

          【讨论】:

          • 好的!如果您需要当前的 nre 功能。你是做什么的?
          • 无需对此投反对票。这是一个非常有效的答案,即使您自己不能使用它。 Inno Setup 仍然使用 Delphi 2 和 3 编译,以实现最小的可执行文件大小。我们说的是几个 10 kByte,很容易。
          【解决方案11】:

          我总是使用UPX 来压缩 exe 文件。它工作得很好,通常会导致 2 倍压缩。当然,禁用所有调试信息将有助于减小文件大小。

          【讨论】:

          【解决方案12】:

          使用像the one from Red Gate 这样的内存分析器来实时查看运行时内存使用情况。

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-28
              • 1970-01-01
              • 2011-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-30
              相关资源
              最近更新 更多