Borland Delphi 7 FastMM RTL 补丁(0分)

L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
Borland Delphi 7 FastMM RTL 补丁:
---------------------------------

=^0^=


发布者:
-------

Lsuper @ DelphiBBS

任何问题,欢迎到 DelphiBBS 提出 ...

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3373649


说明:
-----

Delphi 2006 中一个重要的更新就是使用开源内存管理器 FastMM 替调了使用了 N 年的老内存管理器。

FastMM 在外国 Delphi 社区非常有名,其主要目的就是重新实现一个高效、安全、稳定的内存管理器(Borland 的内存管理器问题多多,如 Dll 和 Exe 间无法共享,多线程下效率底--一些情况下甚至于低一个数量级!),在代号为 Dexter 的 Delphi 2006 没 release 之前已经听李维大肆鼓吹说 Dexter 如何出色,还在 CSDN 上说他 Demo 证明 FastMM 在 Delphi 和 BCB 下能提高 NNN% 的效率!

FastMM 的主页:

http://fastmm.sourceforge.net

相对旧内存管理器,FastMM 有诸多的优点:

1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)

2、实现了内存管理器共享机制,Exe 和 Dll 间共享内存管理器不需要任何 Dll 支持

3、集成了内存泄漏检测功能

4、充分兼容现有的代码、Delphi 旧内存管理器模式

5、为了加速 Delphi IDE(如 Delphi 5/6/7、Delphi 2005)的启动速度、管理内存占用等,他提供了 BorlndMM.dll 的替代,直接替换 Bin 中的 Dll 即可!

如果想在 Delphi 7 下使用,最最简单的方法当然是在 dpr 中第一个 uses FastMM4

既然在 Delphi 2006 中的内存管理器如此之棒,一个非常自然的想法:能不能把 Delphi 2006 中的新内存管理器完全移植到 Delphi 7 下?


修改:
-----

通过 UltraEdit 和 WinMerge 等大量搜索、对比 Delphi 7(Version 7 Build 8.1) 和 Delphi 2006(Version 10.0.2166.28377),发现其实移植的工作量没有想象中的复杂 :>

主要有:修改 System.pas 中的内存管理函数;GetMem.inc 的完全替代!附带的,由于 Delphi 2006 中的 Move 和 FillChar 函数使用的是开源 FastCode 更具效率的实现,“顺手牵羊”了一把 n_n ...

1、使用 Delphi 7(Version 7 Build 8.1)的 System.pas 作为原本

2、使用的内存管理器完全替换为 Delphi 2006 的内存管理器(GetMem.inc/System.pas)

3、修改 Move、FillChar 为 Delphi 2006 的 System.pas 中的实现

4、所有操作在中文版 Windows XP sp2 + Delphi 7 下完全测试通过


使用:
-----

1、运行 RTL/Make.bat,编译出 Dcu 文件

2、运行 RELEASE/Copy.bat,他会复制文件到相应文件夹

3、如果想恢复原始文件,运行 BACKUP/Restore.bat

注意:如果你的 Delphi 没有安装在默认路径(C:/Program Files/Borland/Delphi7),请修改 bat 中相应的路径


文件:
-----

RTL 文件夹 Delphi 7 RTL 替换文件
BACKUP 文件夹 Delphi 7 RTL 备份文件
DEMO 文件夹 一个测试例子。注意:例子中在 Dll 和 Exe 之间传递 string 而不需要引用任何的 ShareMem 或 FastMM!
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
这是下载连接: http://down1.tomore.com/source/20060306/2006030615155529178.rar
 
K

kinneng

Unregistered / Unconfirmed
GUEST, unregistred user!
李某大肆鼓吹的东西多着,在下不以为然,或者干脆说,没有效果,有也是偶尔的,特例的,纯白忙。
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
=^0^= 我只相信自己项目的实测对比数据。
 
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
GOOD。
能不能贴出测试对比数据?
 
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
另外,请问您是如何通过测试保证修改不会引起其它问题的?
 

吖诚

Unregistered / Unconfirmed
GUEST, unregistred user!
不知道该怎么办了
 
M

MarkDean

Unregistered / Unconfirmed
GUEST, unregistred user!
支持你,像支持FastMM一样。
已使用,目前没有发现问题。
 

特尔斐

Unregistered / Unconfirmed
GUEST, unregistred user!
如果使用运行时包,这个东东有用不?
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
例子? 随手写一个:

procedure TForm1.Button1Click(Sender: TObject);
var
t: TDateTime;
I: Integer;
pData: Pointer;
begin
t := Now;

for I := 1 to 1000000 do
try
GetMem(pData, I);
finally
FreeMem(pData);
end;

ShowMessage(FormatFloat('0.00', 24 * 60 * 60 * (Now -t)));
end;

在我的机器上(AMD 1.8G 512M):
使用原来 RTL 大概 8.9-9.1S
使用 FastMM 替换的 RTL 大约 4.5-4.7S

更多的例子可以自己验证,我想李维说得 10-300% 绝对不是空口无凭的。
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
附带的说一句:我确实无法“通过测试保证修改不会引起其它问题的”,至少在我现在的工程中没有任何的问题。
我只能说,这个 getmem.inc 就是 Delphi 2006 中的内存管理器核心,它增强了特别是常规内存分配、多线程应用等方面的性能,我所作的只是把它移植到 Delphi 7 的 RTL 中。附带的说,如果你仔细的对比 RTL 源码(如使用 WinMerge),你会发现,Delphi 2006 编译出来的程序相对 Delphi 7 编译的来得快是有其必然的道理的:
1、使用了全新的内存管理器
2、很多核心 RTL 函数使用的是开源的 FastCode 的实现,更具效率
3、很多核心 RTL 函数直接使用 inline 声明、编译!
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
to 特尔斐:如果使用运行时包,这个东东“应该”有用。
理由:使用了全新的内存管理器了啊。;>
 
W

WUSUBAR

Unregistered / Unconfirmed
GUEST, unregistred user!
不错 感觉很快
 
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
再次感谢LSUPER的奉献精神!真的!
从你这个帖子才知道FastCode,他们在YAHHO有个新闻组挑战如何提升执行速度,真有意思。

惭愧!其实我上面主要是想问你移植的是否完整,是否会引起兼容问题,因为我自己暂没有时间去测试[:D]

另外请教楼主一个问题,FastMM和FastCode都是只需要在项目的源文件的最开始部分引用相关单元即可,他们是如何做到的?为什么不需要项目每个单元都引用?
 
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
以后不再需要另外引用FastMM了[:D]
不过,不知道d2006是否使用了最瓣片的FastMM 4.62?
 
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
测试结果:
程序中不需要引用FastMM4
程序运行速度有所提高

错误如下:
把DEMO中MainFrm.pas的
Caption := Execute;
注释掉出错,出错原因不解。
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
to EdwinYeah:
1、FastCode 是通过直接 Patch 掉 Delphi 的函数实现的,如你使用 Delphi RTL 中的 Pos 函数,引用 FastCode 相应的单元后在单元的初始节他会根据不同的 CPU 类型把 Delhpi 的函数替换成最优的函数进行调用,至于如何替换,这个你下他的源码看看就知道了(其实非常的简洁!);>
2、FastMM 也是单元的初始节把 Delphi 原来的内存管理器替掉了啊。
3、说到稳定性,我不敢打包票,至少我现在没遇到问题;权当自娱自乐吧 ...
=^0^=
 
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
LSUPER能帮看看吗?
错误如下:
把DEMO中MainFrm.pas的
Caption := Execute;
注释掉出错,出错原因不解。
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
非常感谢 liuchong 的提醒,原来在 FastMM4 的说明中提到,需要在 Exe 和 Dll 之间共享内存管理器时需要引用 SimpleShareMem 这个单元的;在我的 Demo 中发现不引用这个好像也没问题(可能和我的“静态导入 DLL”的使用方式有关?),所以发布时去掉 SimpleShareMem 了,重新引入这个 pas 即可。
BTW:SimpleShareMem 的作用就是告诉 FastMM 需要“共享”内存管理器。其实代码非常的简单,这个 Delphi 2006 中带的:

{ *********************************************************************** }
{ }
{ Borland Delphi Memory Manager }
{ }
{ Copyright (c) 2005 Borland Software Corporation }
{ }
{ Portions created by Pierre le Riche are }
{ Copyright (c) Pierre le Riche / Professional Software Development }
{ }
{ Acknowledgement: With special thanks to the Fastcode community and }
{ supporters for their valuable input and feedback. }
{ }
{ }
{ *********************************************************************** }

(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* This memory manager implementation is subject to the
* Mozilla Public License Version 1.1 (the "License")
you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS&quot
basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* ***** END LICENSE BLOCK ***** *)

unit SimpleShareMem;

interface

implementation

initialization
{Try to use a shared memory manager. If one is not available, start sharing
the current one.}
If not AttemptToUseSharedMemoryManager then
ShareMemoryManager

end.
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经重新发布了 1.1 的 patch,主要是在 System.pas 的初始节最后加入共享内存管理器功能。
使用:运行 RTL 中的 Replace.bat 即可
恢复:运行 BackUp 中的 Restore.bat
非常感谢大家的支持。
 
顶部