FastMM
در مورد مدیر حافظهی جدید دلفی، قبلاً در سایت برنامهنویس مطالبی نوشته شده.
مدیر حافظهی جدید دلفی که از زمان دلفی 2005 به کار گرفته شده، علاوه بر استفاده در IDE دلفی در برنامههای کامپایل شدهی دلفی نیز استفاده میشود. وقتی یک پروژهی موجود را با دلفی 2007 باز میکنید و آن را دوباره کامپایل میکنید، بطور خودکار از مدیر حافظهی جدید دلفی بهرهمند خواهید شد. مدیر حافظهی جدید دلفی، FastMM 4 نامیده میشود و به عنوان یک مدیر پروژهی جدید توسط "پیر لا ریش" که یک برنامهنویس دلفی اهل آفریقای جنوبی ست توسعه داده شده است. FastMM 4 مواردی همچون تخصیص حافظه، افزایش سرعت و آزادسازی بیشتر Ram برای استفادهی بعدی را بهینه کرده است( مدیر حافظهی قدیمی دلفی از تکه تکه شدن بیش از اندازهی حافظه رنج میبرد) . این بیشتر برای برنامههای multi-thread صحیح است. FastMM همچنین توانایی انجام بررسی حافظهای بسیار وسیع را در جهت پاکسازی و تمیز کردن موثر حافظه به دلیل استفادهی نادرست از objectهای حذف شده را دارد. این مدیر حافظه همچنین میتواند گزارشاتی از اشیا باقی مانده در حافظه فراهم کند که مطمئناً در یافتن Memory Leak به شما کمک خواهند کرد.
در نسخهای که به همراه دلفی منتشر میشود ویژگیهای اصلی وجود دارد اما عملاً تعداد بیشتری از ویژگیهای پیشرفتهی FastMM در نسخهی کامل کتابخانه در دسترس هست و به همین چند مورد که به RTL دلفی اضافه شده، ختم نمیشود. به این شکل دلفی ضامن یک سازگاری بهتر با برنامههای موجود هست و از ویژگیهای نیرومند که همهی برنامهنویسان نمیتوانند به آسانی بر آن تسلط پیدا کنند، دوری میکند.
همانطور که قبلاً گفتم برای استفاده از مدیر حافظهی جدید دلفی لازم نیست کار خاصی انجام دهید: پروژهتان را در دلفی باز کنید و آن را دوباره کامپایل کنید. سورس کامل این مدیر حافظه را میتوانید از آدرس http://fastmm.sourceforge.net دریافت کنید.
FastMM4 به خاطر کیفیت فنی آن از طرف بورلند انتخاب شد، و همینطور به دلیل تست حافظهی موفقی که با پروژهی FastCode داشت.
این متن برگرفته از سایت پروژهی FastCode به آدرس http://fastcode.sourceforge.net هست که در تاریخ 17 ژانویه 2007 بروز شده است.
FastCode
پروژهی FastCode، توابع بسیار بهینه شدهای را برای دلفی کاران تهیه کرده ست. این توابع، نسخهی سریعتری از توابع زمان اجرای دلفی(RTL)، توابع VCL و توابع اضافی دیگر هست. میتوان توابع را با اسمبلر نوشت و از تمام مجموعه دستورات جدید و مدرن MMX, SSE, SSE2, SSE3, SSSE3, 3DNOW, 3DNOW+ استفاده کرد. ما توابع بهینهای را برای همه پروسسورهای جدید و همچنین نسخههایی که در پروسسورهای قدیمیتر نیز اجرا خواهند شد، تهیه کردهایم. در این مجموعهی کتابخانه، بیش از 300 تابع به صورت رایگان برای دانلود در دسترس هست.
در تلاش برای رسیدن به بالاترین سطح بهینگی، عدهای از برنامهنویسان دلفی تعدادی مجموعه تست برای فراخوانی بخشی از توابع RTL تعریف کردند. تقریباً پیادهسازی بیشتر توابع RTL توسط Pascal انجام گرفته، حال آنکه توابع فعلی به زبان سطح پائین اسمبلی نوشته شده ست. این مجموعه تست را میتوانید از آدرس http://fastcode.sourceforge.net/challenge_content دریافت کنید.
فعلاً ابزار محک و تائید برای 61 تابع با بیش از 35.000 خط وجود دارد. این توابع دقیقاً از قابلیتهای توابع متناظر موجود در VCL و RTL تبعیت میکنند، این برای توابعی ست که مشابه آن به زبان پاسکال از قبل وجود داشته و متناظر با آن با اسمبلر در پروژهی FastCode نوشته شده ست. اما اگر هیچ تناظری در کار نبود، توضیح موجود در تابع قابلیت آن را شرح میدهد.
کتابخانهی توابع FastCode و ابزار تائید و محک آن تحت لیسانس MPL 1.1 منتشر میشود.
FastCode از زمان Delphi 2005 به دلفی اضافه شده ست و در نسخههای بعدی دلفی یعنی دلفی 2006 و دلفی 2007 نیز بیشتر از این پروژه استفاده میشود.
مثال زیر مقایسهی تابع UpperCase در دلفی 5 با دلفی 2007 هست :
Delphi 5
function UpperCase(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L := Length(S);
SetLength(Result, L);
Source := Pointer(S);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if (Ch >= 'a') and (Ch <= 'z') then Dec(Ch, 32);
Dest^ := Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;
Delphi 2007
function UpperCase(const S: string): string;
asm {Size = 134 Bytes}
push ebx
push edi
push esi
test eax, eax {Test for S = NIL}
mov esi, eax {@S}
mov edi, edx {@Result}
mov eax, edx {@Result}
jz @@Null {S = NIL}
mov edx, [esi-4] {Length(S)}
test edx, edx
je @@Null {Length(S) = 0}
mov ebx, edx
call system.@LStrSetLength {Create Result String}
mov edi, [edi] {@Result}
mov eax, [esi+ebx-4] {Convert the Last 4 Characters of String}
mov ecx, eax {4 Original Bytes}
or eax, $80808080 {Set High Bit of each Byte}
mov edx, eax {Comments Below apply to each Byte...}
sub eax, $7B7B7B7B {Set High Bit if Original <= Ord('z')}
xor edx, ecx {80h if Original < 128 else 00h}
or eax, $80808080 {Set High Bit}
sub eax, $66666666 {Set High Bit if Original >= Ord('a')}
and eax, edx {80h if Orig in 'a'..'z' else 00h}
shr eax, 2 {80h > 20h ('a'-'A')}
sub ecx, eax {Clear Bit 5 if Original in 'a'..'z'}
mov [edi+ebx-4], ecx
sub ebx, 1
and ebx, -4
jmp @@CheckDone
@@Null:
pop esi
pop edi
pop ebx
jmp System.@LStrClr
@@Loop: {Loop converting 4 Character per Loop}
mov eax, [esi+ebx]
mov ecx, eax {4 Original Bytes}
or eax, $80808080 {Set High Bit of each Byte}
mov edx, eax {Comments Below apply to each Byte...}
sub eax, $7B7B7B7B {Set High Bit if Original <= Ord('z')}
xor edx, ecx {80h if Original < 128 else 00h}
or eax, $80808080 {Set High Bit}
sub eax, $66666666 {Set High Bit if Original >= Ord('a')}
and eax, edx {80h if Orig in 'a'..'z' else 00h}
shr eax, 2 {80h > 20h ('a'-'A')}
sub ecx, eax {Clear Bit 5 if Original in 'a'..'z'}
mov [edi+ebx], ecx
@@CheckDone:
sub ebx, 4
jnc @@Loop
pop esi
pop edi
pop ebx
end;