Borland Delphi 7 FastMM RTL 补丁(0分)

L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
嗯,感觉不爽,需要带上这个 SimpleShareMem.pas,其实代码就两句:

if not AttemptToUseSharedMemoryManager then
ShareMemoryManager

一个方法,可以直接放到 System.pas 的 initialization 过程的最后:

...
DefaultUserCodePage := LCIDToCodePage(GetThreadLocale);
{$ENDIF}
MainThreadID := GetCurrentThreadID;

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

finalization
Close(Input);
...

然后运行 Replace.bat 重新编译所有 dcu,就可以不带 SimpleShareMem 而且发布的 Exe 和 Dll 不需要 BorlndMM.dll 啦。
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
想想:既然 System.pas 已经被我们修改了,干脆改到底?(按照上面的修改 System.pas 彻底扔掉 ShareMem、FastShareMem 或者 FastMM4 等等) ...
这是 1.1 的主要修改。
 
Y

yxsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
我直接用2006了,应该是有进步的,但我没感觉出来,呵呵
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
=^0^=

在 2006 下试试这个例子:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
TButton.Create(nil);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
end;

end.
 
L

lop

Unregistered / Unconfirmed
GUEST, unregistred user!
真有意思,坐下听课.
 
S

sjm

Unregistered / Unconfirmed
GUEST, unregistred user!
to 楼主:
我还是有些不太明白。楼主提到需要在.dpr中首先加上 uses FastMM4,我加上后报错:File not found : FastMM4.dcu.没办法又去掉该语句,但不知FastMM是否还起作用?
另外,下载V1.1并解压后,我把RTL文件夹中的Replace.bat中的Delphi7路径按自身情况改了一下,然后就运行Replace.bat文件,请问FastMM的全部安装过程是否仅此而已?我在Delphi7的IDE中运行原先编好的软件好像体会不出有什么变化,速度差不多。楼主能否再详细介绍一下FastMM的强项?谢谢!
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
to sjm:
1、不需要引用 FastMM4 啊,这个 RTL Patch 的目的就是移植 Delphi 2006 中的内存管理器(内核就是 FastMM4 的)到 Delphi 7;所以,执行 Replace.bat 后 Delphi 7 的 RTL 代码中已经集成 FastMM4 了;换句话说,你的源码不需要任何的改动!(当然,如果以前的项目引用了 ShareMem 此时应该去掉!)
2、FastMM 的特点具体的可以看他的说明文档啊;大体上:更高效(执行效率),更便捷(共享内存管理器而不需要额外的 dll),更易用(集成内存泄漏检测功能!)
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
有个想法:如果 Delphi 7 使用 RTL Patch 享受 FastMM 的诸多有点而不需要改动现有项目的任何一行代码,岂不更好?(随时可以扔掉 Patch 或启用 Patch 而不需要修改任何代码!)
其实方法非常的简单,就是使用 1.0 的所有文件,然后用上面的 SimpleShareMem.pas 文件代替 Delphi 原来的 ShareMem 即可!
这个想法比较好,它甚至于有可能兼容 FastShareMem、ShareMemRep 等第三方的共享内存管理器!
嗯,有时间再看看(因为有人跟我说,最好就是“不需要任何的共享内存管理器单元”) ...
 
S

sjm

Unregistered / Unconfirmed
GUEST, unregistred user!
原来是这样,谢谢LSUPER,也请将Readme.txt中的“1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)&quot
改为:1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(完全不需要加uses FastMM4,that is all ...),以免造成误会。
Thanks a lot!
 
D

DoorKey

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主好样的,省了我不少事情,我来帮忙测试。正郁闷D7的IDE经常出现内存Read FFFFFFFF错误呢,看看用上这个会不会比较好。我拿我负责的公司项目来测试一定够火力。
 
D

daxu

Unregistered / Unconfirmed
GUEST, unregistred user!
试了

再运行Delphi 提示:[Fatal Error] File not found: 'System.pas'
现在 Delphi7
dcc32.exe 是 Delphi2006的
borlndmm.dll 是 FastMM4 的
lib路径,rtl source路径都试过了,
修了3个钟头了,还没好!

记得当年精简delphi5 时遇到过这问题,这会儿没办法

楼上各位帮看看。
 
G

gz_runwe

Unregistered / Unconfirmed
GUEST, unregistred user!
楼主真的很有心啊,不过我感觉把SimpleShareMem合并到System单元文件中也不太好,因为毕竟不是什么时候都需要使用共享内存单元的.

另外,新发布的1.1Patch在使用FastMM4.62后,好象有问题,造成我的程序出现错误,我想就是因为SimpleShareMem合并到System单元文件的原因吧.

楼主开了个好头啊,我建议把getmem.inc单元文件改成直接引用FastMM.pas程序,可能这样更有通用性,以后如果FastMM升级了,直接更换FastMM单元文件就好了,如果能改成这样,D2006也可以做一个Patch了,楼主认为如何?
 

狂迷

Unregistered / Unconfirmed
GUEST, unregistred user!
有没有试过:
NexusDB.Memory.Manager.v2.03.Delphi.BCB.Retail-CORE
据说这个内存管理做得非常好.我正为我的服务器软件内存泄漏头痛.
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
to sjm:
正在犹豫中,感觉集成 sharemem 到 system 中确实不爽啊
to DoorKey:
公司 N 人已经被我怂恿者使用 borlndmm.dll 了;不过通常是安装过多的专家或控件导致 Delphi 的不稳定 ;>
to daxu:
到 Source/rtl/sys 和 lib、lib/Debug 下确认文件的日期啊,确定 system.dcu 在 lib、lib/Debug 下
to gz_runwe:
确实有点偏向于不把 SimpleShareMem 合并到 System 中;不过 FastMM4 本来就可以直接在 Delphi 7 和 Delphi 2006 下使用的啊(做这个 Patch 就是不想手工引用 FastMM4,或者说,想让 Delhpi 7 直接使用 Delphi 2006 的内存管理器的一个尝试:)
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
to 狂迷:据说 NDB 的效率没有 FastMM 的好(FastCode 有测试的 :)。
 

狂迷

Unregistered / Unconfirmed
GUEST, unregistred user!
没用过 D2006,也不打算用, D7以经足够用了,只想找个好一点的内存管理。
转个贴
# Delphi2006消耗内存那不是一般的大 2005-12-22 9:37 AM donghaixiaoxiao
Delphi2006消耗内存,我的一个近三万行的代码,在连续修改编译了三个小时后,居然吃掉140M内存,D7可是最多70多M呀
 

狂迷

Unregistered / Unconfirmed
GUEST, unregistred user!
最新版是FastMM 4.62 [Notes] (2006-02-22 05:49)
你用的是哪一版?
 
L

LSUPER

Unregistered / Unconfirmed
GUEST, unregistred user!
这个 Patch 使用的 FastMM 来自于 Delphi 2006 的 GetMem.inc。
还有,Delphi 编译器在编译一个工程时为了加快下次编译的速度,会缓存当前编译结果(估计是那些 dcu 信息?),所以如果“连续修改编译了”特别是打开一个 group 编译一堆的 dpr 会爆占内存,这个不仅仅是 Delphi 2006 的问题,至少在我用过的 Delphi 5/6/7 都这样子。
BTW:记得欧以前 Delphi 7 一个十几个 dpr 的 group 全编译后 Delphi 竟然占了 300 多 M 的内存!现在偶是:Delphi 打开 group 同时编译不超过两个 dpr,同时编译多个 dpr 时使用 finalbuilder 或者命令行。
 

狂迷

Unregistered / Unconfirmed
GUEST, unregistred user!
这是 4.62 的文件,好像与 Patch 中有所不同,试试再决定用哪个。
2006-03-13 22:31 <DIR> CPP Builder Support
2006-03-13 22:31 <DIR> FullDebugMode DLL
2006-03-13 22:31 <DIR> Replacement BorlndMM DLL
2006-03-13 22:31 <DIR> Translations
2006-03-13 22:31 <DIR> Usage Tracker
2006-02-22 15:35 283,844 FastMM4.pas
2006-02-20 11:50 9,898 FastMM4_FAQ.txt
2005-12-21 13:51 9,611 FastMM4_Readme.txt
2005-10-26 12:39 6,787 FastMM4Messages.pas
2006-02-22 11:28 13,931 FastMM4Options.inc
 

狂迷

Unregistered / Unconfirmed
GUEST, unregistred user!
改一下,测试,不错能提升 33%! 只是不知道稳定性怎样。
var
t: Cardinal;
I: Integer;
PData: PTest;
begin
t := GetTickCount;
for I := 1 to 10000000 do
try
New(PData);
PData^.Data := IntToStr(I);
finally
Dispose(pData);
end;
t := GetTickCount - t;
ShowMessage(IntToStr(t));
end;
 
顶部