السلام عليكم ورحمة الله و بركاته
هدا برنامج برمجته لتحويل الملفات الى مصفوفة من البيتات وهو سريع في التحويل لاعتماده على الصنف
TStringBuilder
مرفق لكم السورس بكلا اللغتين دلفي و سي++
لكن لا حظت ان الدلفي اسرع عند التحويل رغم اني حولت السورس الى نفس الكود بلغة السي++
اترك لدوي الخبرة التجربة والمقارنة
جميل جدا أن نرى استخدام مثل هذه الفئات الجديدة خصوصا وان هده الفئات كانت ولا تزال حكرا على مبرمجي الدوت نت ..
لقد سبق وقمت بوضع موضوع في مدونتي يتحدث عن هده الفئة (
استخدام الفئة TStringBuilder )
إقتباس :لكن لا حظت ان الدلفي اسرع عند التحويل رغم اني حولت السورس الى نفس الكود بلغة السي++
أعتقد أن السبب راجع الى
التغليف .. فكما يعلم الجميع أن مكتبة ال vcl & و الكلاسس الخاصة ب C++ Builder مكتوبة بالباسكال وحتى تتمكن من استخدامها فلازم يكون هناك تغليف لهده الأخيرة بلغة السي ++ ,-الكلاس TStringBuilder يحتوي على الكثير من الدوال .. كلها تم تغليفها - لدلك فمسألة التغليف لا يمكن تجاهلها
عندما تقوم بانشاء برنامج بالسي ++ بويلدر فسيتم ربطه بالباكج الخاص بدلفي مثل ال vcl
لقد سبق ووعدت شركة codegear / EMB باعادة كتابة منصة ال vcl ب السي ++ .. لكن لا أعتقد انها ستفي بوعدها .. فهدا الامر سيستغرق الكثير و الكثير من وقتها ..
على كل حال الخيار الأمثل في مثل هده الحالات هو استخدام مكتبات ال dll المبرمجة بدلفي في برامج ال سي ++ بويلدر
إقتباس :أعتقد أن السبب راجع الى التغليف ..
هل هو اعتقاد ام أنك متأكد أخي الكريم
me_delphi كتب :هل هو اعتقاد ام أنك متأكد أخي الكريم
بغض النظر عن ذلك .. فالتغليف يعني اعادة التوجيه => تعليمات أسمبلي زائدة
ألق نظرة على هذا المثال
@1
PHP كود :
void DoShowMsg()
{
MessageBox(0,"Test",0,0);
}
void ShwMsg()
{
DoShowMsg ();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShwMsg();
}
بعد أن تتم عملية ال Link :
PHP كود :
PUSH EBP
MOV EBP,ESP
CALL Project2.DoShowMsg ; [Project2.DoShowMsg
; Project2.DoShowMsg Instruction :
PUSH EBP
MOV EBP,ESP
PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
PUSH 0 ; |Title = NULL
PUSH Project2.00458198 ; |Text = "Test"
PUSH 0 ; |hOwner = NULL
CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
POP EBP ; Project2.0040195C
RETN
;End Project2.DoShowMsg
POP EBP
RETN
أما اذا لم نستخدم التغليف
@2
PHP كود :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MessageBox(0,"Test",0,0);
}
سيترجم الى
PHP كود :
PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
PUSH 0 ; |Title = NULL
PUSH Project2.004581A5 ; |Text = "Test"
PUSH 0 ; |hOwner = NULL
CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
بمقارنة @1 مع @2 نلاحظ أن هناك تعليمتين اضافيتين قبل عرض الرسالة
وتعليميتن عند النهاية :
للأسف فأنا لم أستطع دراسة مثالك لأني أسخدم CBuilder 2007 & Delphi XE3
يعني يمكنني تجربته فقط على دلفي
هناك شيئ آخر عند المقارنة : يجب أن تكون كلتا النسختين من نفس الصنف .. يعني
Delphi Debug vs c++Debug
or
Delphi Release vs c++ Release
هناك عامل آخر
دلفي يستخدم Object Pascal Runtime Library فقط
أما CBuilder فيستخدم C++ Runtime Library & Object Pascal Runtime Library وهذا يفسر حجم تطبيق فارغ ب السي ++ بويلدر مقارنة مع دلفي لنفس التطبيق
إقتباس :دلفي يستخدم Object Pascal Runtime Library فقط
أما CBuilder فيستخدم C++ Runtime Library & Object Pascal Runtime Library وهذا يفسر حجم تطبيق فارغ ب السي ++ بويلدر مقارنة مع دلفي لنفس التطبيق
بار ك الله فيك أخي SMP3
هل تقصد ان حجم تطبق دلفي أصغر من سي++ بويلدر
بالنسبة لدلفي XE و س++ XE
فان تطبيق دلفي Release حجمه 896 كيلوبايت
وسي ++ Release حجمه 122 كيلوبايت
هدا فقط في تطبيق فارغ
انا لاحظت من س++ بويلدر يعطي حجما أقل رغم اعتماده على VCL كدلفي
إقتباس :انا لاحظت من س++ بويلدر يعطي حجما أقل رغم اعتماده على VCL كدلفي
أعتقد أنك مخطأ في هذا ..
هل تأكدت من ال Runtime pkg !! لكلتا النسختين ?
نعم أخي smp3 لقد اطلعت على الخيارات فوجدتك محقا بار ك الله فيك أخي الكريم