Borland Delphi 7 FastMM RTL 补丁(0分)

  • 主题发起人 主题发起人 LSUPER
  • 开始时间 开始时间
嗯,感觉不爽,需要带上这个 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 啦。
 
想想:既然 System.pas 已经被我们修改了,干脆改到底?(按照上面的修改 System.pas 彻底扔掉 ShareMem、FastShareMem 或者 FastMM4 等等) ...
这是 1.1 的主要修改。
 
我直接用2006了,应该是有进步的,但我没感觉出来,呵呵
 
=^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.
 
真有意思,坐下听课.
 
to 楼主:
我还是有些不太明白。楼主提到需要在.dpr中首先加上 uses FastMM4,我加上后报错:File not found : FastMM4.dcu.没办法又去掉该语句,但不知FastMM是否还起作用?
另外,下载V1.1并解压后,我把RTL文件夹中的Replace.bat中的Delphi7路径按自身情况改了一下,然后就运行Replace.bat文件,请问FastMM的全部安装过程是否仅此而已?我在Delphi7的IDE中运行原先编好的软件好像体会不出有什么变化,速度差不多。楼主能否再详细介绍一下FastMM的强项?谢谢!
 
to sjm:
1、不需要引用 FastMM4 啊,这个 RTL Patch 的目的就是移植 Delphi 2006 中的内存管理器(内核就是 FastMM4 的)到 Delphi 7;所以,执行 Replace.bat 后 Delphi 7 的 RTL 代码中已经集成 FastMM4 了;换句话说,你的源码不需要任何的改动!(当然,如果以前的项目引用了 ShareMem 此时应该去掉!)
2、FastMM 的特点具体的可以看他的说明文档啊;大体上:更高效(执行效率),更便捷(共享内存管理器而不需要额外的 dll),更易用(集成内存泄漏检测功能!)
 
有个想法:如果 Delphi 7 使用 RTL Patch 享受 FastMM 的诸多有点而不需要改动现有项目的任何一行代码,岂不更好?(随时可以扔掉 Patch 或启用 Patch 而不需要修改任何代码!)
其实方法非常的简单,就是使用 1.0 的所有文件,然后用上面的 SimpleShareMem.pas 文件代替 Delphi 原来的 ShareMem 即可!
这个想法比较好,它甚至于有可能兼容 FastShareMem、ShareMemRep 等第三方的共享内存管理器!
嗯,有时间再看看(因为有人跟我说,最好就是“不需要任何的共享内存管理器单元”) ...
 
原来是这样,谢谢LSUPER,也请将Readme.txt中的“1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(“取代”就是第一个 uses FastMM4,that is all ...)&quot
改为:1、彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器(完全不需要加uses FastMM4,that is all ...),以免造成误会。
Thanks a lot!
 
楼主好样的,省了我不少事情,我来帮忙测试。正郁闷D7的IDE经常出现内存Read FFFFFFFF错误呢,看看用上这个会不会比较好。我拿我负责的公司项目来测试一定够火力。
 
试了

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

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

楼上各位帮看看。
 
楼主真的很有心啊,不过我感觉把SimpleShareMem合并到System单元文件中也不太好,因为毕竟不是什么时候都需要使用共享内存单元的.

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

楼主开了个好头啊,我建议把getmem.inc单元文件改成直接引用FastMM.pas程序,可能这样更有通用性,以后如果FastMM升级了,直接更换FastMM单元文件就好了,如果能改成这样,D2006也可以做一个Patch了,楼主认为如何?
 
有没有试过:
NexusDB.Memory.Manager.v2.03.Delphi.BCB.Retail-CORE
据说这个内存管理做得非常好.我正为我的服务器软件内存泄漏头痛.
 
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 的内存管理器的一个尝试:)
 
to 狂迷:据说 NDB 的效率没有 FastMM 的好(FastCode 有测试的 :)。
 
没用过 D2006,也不打算用, D7以经足够用了,只想找个好一点的内存管理。
转个贴
# Delphi2006消耗内存那不是一般的大 2005-12-22 9:37 AM donghaixiaoxiao
Delphi2006消耗内存,我的一个近三万行的代码,在连续修改编译了三个小时后,居然吃掉140M内存,D7可是最多70多M呀
 
最新版是FastMM 4.62 [Notes] (2006-02-22 05:49)
你用的是哪一版?
 
这个 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 或者命令行。
 
这是 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
 
改一下,测试,不错能提升 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;
 
后退
顶部