优化delphi程序的内存使用

请看Windows任务管理器的屏幕截图。。。...

01

2006年

windows对程序的内存使用有何看法?

windows taskbar manager

请看Windows任务管理器的屏幕截图。。。

最右边的两列表示CPU(时间)使用情况和内存使用情况。如果某个进程严重影响其中任何一个,则系统将减速。

经常影响CPU使用率的是循环的程序(询问任何忘记在文件处理循环中放入“read next”语句的程序员)。这类问题通常很容易纠正。

另一方面,内存使用并不总是显而易见的,需要管理而不是纠正。例如,假设正在运行一个捕获类型的程序。

这个程序一整天都在使用,可能是为了帮助台的电话捕获,或者是为了其他原因。每二十分钟关闭一次,然后再重新启动是没有意义的。它将在一天中使用,尽管偶尔使用。

如果该程序依赖于一些繁重的内部处理,或者其窗体上有大量的插图,那么它的内存使用量迟早会增加,为其他更频繁的进程留下更少的内存,从而推高分页活动,最终降低计算机的速度。

02

2006年

何时在delphi应用程序中创建表单

Delphi program DPR file listing auto-create forms

假设您要设计一个包含主窗体和两个附加(模态)窗体的程序。通常,根据您的Delphi版本,Delphi将把表单插入到项目单元(DPR文件)中,并包含一行,用于在应用程序启动时创建所有表单(application.CreateForm(…)

项目单元中包含的行是由Delphi设计的,对于不熟悉Delphi或刚刚开始使用Delphi的人来说非常有用。这既方便又有帮助。这也意味着所有表单都将在程序启动时创建,而不是在需要时创建。

根据项目内容和实现的功能,表单可能会占用大量内存,因此表单(或通常为:对象)只应在需要时创建,并在不再需要时销毁(释放)。

如果“MainForm”是应用程序的主窗体,那么它必须是在上面示例中启动时创建的唯一窗体。

“DialogForm”和“OccasionalForm”都需要从“自动创建表单”列表中删除,并移动到“可用表单”列表中。

03

2006年

修剪分配的内存:不像windows那样虚拟

Portrait, girl lighted with colorful code

请注意,此处概述的策略是基于以下假设的:所讨论的程序是实时“捕获”类型的程序。然而,它可以很容易地适用于批处理类型的过程。

窗口和内存分配

Windows为其进程分配内存的方式相当低效。它以非常大的块分配内存。

Delphi已尝试将这一点降至最低,并拥有自己的内存管理体系结构,该体系结构使用更小的块,但在Windows环境中,这实际上是无用的,因为内存分配最终取决于操作系统。

一旦Windows为一个进程分配了一个内存块,并且该进程释放了99.9%的内存,Windows仍然会感知到整个内存块正在使用,即使实际上只使用了该块的一个字节。好消息是Windows确实提供了一种解决此问题的机制。shell为我们提供了一个名为SetProcessWorkingSetSize的API。这是签名:

SetProcessWorkingSetSize(hproces:句柄;最小工作集大小:dword;最大工作集尺寸:dword);

04

2006年

强大的setprocessworkingsetsize api函数

Cropped Hands Of Businesswoman Using Laptop At Table In Office

根据定义,SetProcessWorkingSetSize函数设置指定进程的最小和最大工作集大小。

此API旨在允许低级别设置进程内存使用空间的最小和最大内存边界。然而,它确实有一个非常幸运的小怪癖。

如果最小值和最大值都设置为$FFFFFF,则API将临时将设置的大小修剪为0,将其从内存中调出,并且当它反弹回RAM时,它将立即获得分配给它的最小内存量(这一切都发生在几纳秒之内,因此对于用户来说应该是不可察觉的)。

对该API的调用将只在给定的时间间隔内进行,而不是连续进行,因此不会对性能产生任何影响。

我们需要注意以下几点:

  1. 这里提到的句柄是进程句柄,而不是主窗体句柄(因此我们不能简单地使用“句柄”或“Self.handle”)。
  2. 我们不能随意调用这个API,我们需要在程序被认为空闲时尝试调用它。这样做的原因是我们不希望在某些处理(按钮点击、按键、控件显示等)即将发生或正在发生的确切时间削减内存。如果允许这种情况发生,我们将面临遭受访问违规的严重风险。

05

2006年

强制调整内存使用

Reflection of male hacker coding working hackathon at laptop

SetProcessWorkingSetSize API函数旨在允许低级别设置进程内存使用空间的最小和最大内存边界。

下面是一个示例Delphi函数,它封装了对SetProcessWorkingSetSize的调用:

程序trimappmemorysize; 变量主手柄:坦德尔; 开始 尝试mainhandle:=openprocess(process\u all\u access,false,getcurrentprocessid);setprocessworkingsetsize(主句柄,$ffffffff,$ffffffff);闭合手柄(主手柄); 除了 结束;application.processmessages; 结束;

伟大的现在我们有了减少内存使用的机制。唯一的另一个障碍是决定何时调用它。

06

2006年

tapplicationevents onmessage+计时器:=trimappmemorysize now

Businessman using computer in office

在本规范中,我们将其规定如下:

创建一个全局变量以保存主窗体中最后记录的勾号计数。在任何键盘或鼠标活动的任何时候,记录滴答声计数。

现在,根据“现在”定期检查最后一次勾号计数,如果两者之间的差值大于被视为安全空闲时间的时间段,则调整内存。

变量拉斯蒂克:德沃德;

在主窗体上删除ApplicationEvents组件。在其OnMessage事件处理程序中输入以下代码:

程序tmainform.applicationevents1message(变量msg:tagmsg;变量处理:布尔); 开始 案例消息属于沃姆·布顿镇,wm_rbuttondblck,沃尔布顿镇,wm_lbuttondblck,wm_键控:lasttick:=gettickcount; 结束; 结束;

现在决定在什么时间段后您将认为程序处于空闲状态。在我的情况下,我们决定两分钟,但你可以根据情况选择任何时间。

在主窗体上放置计时器。将其间隔设置为30000(30秒),并在其“OnTimer”事件中输入以下单行指令:

程序tmaninform.timer1timer(发送方:tobject); 开始 如果((gettickcount-lasttick)/1000)>120)(self.windowstate=wsminimized)然后trimappmemorysize; 结束;

适应长流程或批处理程序

将此方法用于较长的处理时间或批处理过程非常简单。通常,您会很清楚一个漫长的过程将从何处开始(例如,循环开始读取数百万条数据库记录),以及它将从何处结束(数据库读取循环结束)。

只需在进程开始时禁用计时器,然后在进程结束时再次启用。

  • 发表于 2021-09-15 03:43
  • 阅读 ( 198 )
  • 分类:编程

你可能感兴趣的文章

为什么内存优化器和ram助推器比无用的更糟糕

许多公司想向您销售“内存优化器”,通常作为“PC优化”程序的一部分。这些程序比无用的程序更糟糕——它们不仅不会加速你的电脑,还会减慢它的速度。 这类程序利用没有经验的用户,对提高性能作出虚假承诺。实际上...

  • 发布于 2021-04-11 05:08
  • 阅读 ( 127 )

在windows上不需要的10种系统工具和优化程序

Windows用户看到各种系统工具和优化实用程序的广告。公司很容易告诉你,你必须运行这些工具,但你不需要提供的大部分垃圾。 使用这些系统工具只会减慢你的电脑,浪费你的时间,使你的生活更复杂。简化你的生活和跳过这...

  • 发布于 2021-04-11 16:01
  • 阅读 ( 169 )

新的(new)和C++中删除运算符(delete operator in c++)的区别

C++中new和Delphi运算符的主要区别在于new被用来为对象或数组分配内存,而DELATE用于释放使用新运算符分配的内存。 有两种类型的记忆作为静态和动态记忆。假设一个语句,比如int a;int数组[10];程序员已经知道这些变量需要多...

  • 发布于 2021-07-01 04:35
  • 阅读 ( 179 )

tweakram内存优化器今天免费

...存管理器(memory manager)RAM获取免费许可证。TweakRAM通过优化Windows内存管理来加速您的计算机,当您的计算机慢到爬行速度时,您可以使用TweakRAM手动释放内存。开发商表示:TweakRAM整理计算机内存碎片,提高CPU和主板缓存的效率...

  • 发布于 2021-07-30 10:40
  • 阅读 ( 110 )

如何将媒体文件嵌入delphi可执行文件(rc/.res)(embed media files into a delphi executable (rc/.res))

...止其他人操纵这些加载项文件。 本文将向您展示如何在Delphi可执行文件中嵌入(和使用)声音文件、视频剪辑、动画以及更一般的任何类型的二进制文件。对于最通用的用途,您将看到如何将MP3文件放入Delphi exe中。 资源文...

  • 发布于 2021-09-06 15:08
  • 阅读 ( 189 )

了解delphi编程的基础知识

希望掌握Delphi编程语言的初学者应该已经熟悉Microsoft Windows的基础知识。学习Delphi是最容易的,如果你从一个有指导的、基于教程的参考框架来学习它。 基本概念 从一堂历史课开始,介绍(Turbo)Pascal到Delphi 2005的演变,例...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 180 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 171 )

程序退出时delphi中的内存泄漏通知

自Delphi 2006以来的所有Delphi版本都有一个更新的内存管理器,该管理器速度更快,功能更丰富。 “新”内存管理器最出色的功能之一是允许应用程序注册(和注销)预期内存泄漏,并在程序关闭时报告意外内存泄漏。 使用De...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 165 )

德尔福单元剖析(德尔福初学者版)

如果您打算成为一名优秀的Delphi程序员,那么“接口”、“实现”和“使用”等词需要在您的编程知识中占有特殊的位置。 德尔福项目 当我们创建一个Delphi应用程序时,我们可以从一个空白项目、一个现有项目或Delphi的一...

  • 发布于 2021-09-10 20:53
  • 阅读 ( 180 )

如何构建没有gui的控制台应用程序(build console applications with no gui)

...提供。 对于学生来说,控制台应用程序将简化Pascal和Delphi的学习——毕竟,所有Pascal入门示例都只是控制台应用程序。 新:控制台应用程序 下面介绍如何快速构建在没有图形界面的情况下运行的控制台应用程序。 如果...

  • 发布于 2021-09-10 22:34
  • 阅读 ( 250 )
isLB55B6
isLB55B6

0 篇文章

相关推荐