الشبكة العربية لمطوري الألعاب

مفصول علي محمد أسماعيل  مشاركة 1

تعليقاً على الموضوع :
http://www.agdn-online.com/communities.aspx?view=posts&threadid=687

بتاريخ 01 أيلول 2009 04:02 م، قطب انس حاجبيه بشدة وهو يقول:

و سرعة التفيذ تتراوح ما بين 0.030s و 0.031s .
كيف قمت بقياس السرعة.
وشكرا

محترف  انس مشاركة 2

السلام عليكم.

بطلب من الاخ محمد اسماعيل هاهي الطريقة التي اقيس بها سرعة الاجراءات ( الصورة في الملحقات) في الحقيقة انا لا افعل شيئا و انما البيئة البرمجية هي التي تفعل.

اود الاستفسار عن الطرق الممكنة لفعل هذا .

شكرا لكم.

سلام.

خبير مشرف مؤيد مارديني مشاركة 3

أما في 02 أيلول 2009 12:02 ص، فقد تنهد انس بارتياح وهو يرد:

اود الاستفسار عن الطرق الممكنة لفعل هذا .

الفكرة تكمن بتسجيل وقت بدأ التنفيذ ووقت انتهاؤه فيكون وقت التنفيذ هو الفرق بينهما، فإن فكرنا بتنفيذ الفكرة بصورة مباشرة سنكتب كود شبيه بما يلي :

DateTime startTime;
TimeSpan duration;
startTime = DateTime.Now;
// التعليمات التي نريد قياس زمن تنفيذها
duration = DateTime.Now.Subtract(startTime);

بهذا نكون قد وقعنا بمطبين كبيرين; الأول هو أن هذه الطريقة لا تقيس الزمن الذي استغرقه الإجراء نفسه فحسب، بل تقيس الزمن الذي استغرقه الإجراء كاملاً مضافاً إليه الزمن الذي استغرقته العمليات Processes التي كانت تجري بتزامن مع الإجراء ريثما انتهى.
المطب الثاني نواجهه فقط في البيئات المدارة الذاكرة، أي الـManaged، ففي مثل هذه البيئات يقوم الـGarbage Collector بإيقاف البرنامج في أي وقت يجده مناسباً للقيام بعمله، وعندها، وباستخدام الطريقة السابقة، يضاف وقت قيام الـGC بعمله إلى الوقت المفترض لزمن تنفيذ التعليمات التي نريد قياسها.

لنحل المشكلتين السابقتين، في بيئة دوت نيت، سنقوم في البداية بإخبار الـGC أن يقوم بعمله في الوقت الذي نريده نحن، وليس في الوقت الذي يحلو له :

GC.Collect();
GC.WaitForPendingFinalizers();

السطر الثاني يأمر الـGC بالانتظار ريثما يتم استدعاء إجراءات الإنهاء Finalizing لجميع العناصر Objects الموجودة في الـHeap.
لحل المشكلة الأخرى سنخبر NET. أن يعطينا الوقت الذي استغرقه الـProcess الذي يهمنا، وتحديداً الـThread الذي ينفذ التعليمات التي نرغب بقياسها، أي سنعدل الكود السابق ليصبح :

TimeSpan startTime;
TimeSpan duration;
startTime = System.Diagnostics.Process.GetCurrentProcess().Threads[0].UserProcessorTime;
// التعليمات التي نريد قياس زمن تنفيذها
duration = System.Diagnostics.Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startTime);

هذه هي الطريقة التي أتبعها عندما أريد قياس زمن تنفيذ تعليمة محددة وقد تعلمتها من أحد كتب الـ#C الذي لا أذكر اسمه الآن، أرجو أن تعطي من يهمه الأمر فكرة عن الموضوع، وأرجو ممن عنده ملاحظات أو اقتراحات أن يشاركنا بها.

Moayad Mardini,
MSDN Forums Moderator

مفصول علي محمد أسماعيل  مشاركة 4

تم شطب المشاركة من قبل هيئة الإشراف...

محترف مشرف عبد اللطيف حاجي علي مشاركة 5

وفي 01 أيلول 2009 11:15 م، ظهر شبح ابتسامة على وجه مؤيد مارديني وهو يقول:

لحل المشكلة الأخرى سنخبر NET. أن يعطينا الوقت الذي استغرقه الـProcess الذي يهمنا، وتحديداً الـThread الذي ينفذ التعليمات التي نرغب بقياسها

طريقة جيدة. لم أكن أعلم بها صراحة، ولم يتسنى لي أن أتأكد من مدى فعاليتها. لكن للمهتمين فالإجراء في Win32 API الذي يعيد نفس القيم هو: GetThreadTimes

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير مدير وسام البهنسي مشاركة 6

GetThreadTimes ليس دقيقاً بما يكفي لقياس زمن تنفيذ تعليمة سريعة (احم.. بفرض أنها سريعة) كتحويل رقم إلى صيغة ست عشرية على شكل نص.
 
لقياس أداء مثل هذه الإجراءات يجدر قياس عدد دورات المعالج (cycles) عن طريق تعليمة RDTSC أو الزمن الدقيق باستخدام الإجراء QueryPerformanceCounter في ويندوز. كما يجب أن يتم القياس على عدد كبير من العينات وليس على نداء واحد فقط، وذلك للحصول على معدل أكثر مقاربة للحقيقة.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز