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

موهوب  ياسر أبوبكر مشاركة 1

السلام عليكم
 
كيف يمكن حساب زمن تنفيذ تعليمة ما (أو مجموعة من التعليمات)؟!
 
يوجد في السي شارب كلاس يدعى (stopwatch) بإمكانه أن يفعل ذلك ويقيس الزمن باملي ثانية لكن المشكلة أن زمن تنفيذ التعليمات التي لدي صغير جدا (يمكن أن يقاس بالنانو ثانية) ...
 ويوجد كلاس اخر يدعى (QueryPrefCounter) ولكنه لم يفدني كثيرا لأن قيمه غير دقيقة (على كل حال هو غير موجود في نسخة الفجول ستوديو 2008!!!) ...
 
هل لدى أحد حلول أخرى؟!

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

عند تنفيذ برنامج دوت نت, يقوم المترجم الفوري JIT-Compiler بتحويل تعليمات لغة دوت نت الوسطية المسمات MSIL إلى تعليمات إعتيادية (Native) أي إن البرنامج الذي سيتم تنفيذهه فعلياً مشابه بشكل كبير لبرنامج سي++ إعتيادي. ولكن يضاف لها أشياء مثل جامع النفايات Garbage Collector وأشياء أخرى خاصة بدوت نت... ذلك هو السبب في إن برامج دوت نت قريبة من أداء برامج سي++ بل في بعض الحالات.. تتفوق عليها!!
 
كذلك فإن قياس زمن تنفيذ تعليمه واحدة غير مفيد عموماً, ولكن تستطيع أن تقيس زمن تنفيذ Method أو مجموعة منها لكي تعرف أين يذهب وقت التنفيذ ولكي تتعرف وتحسن من أداء الـ Methods التي تكون مكلفة.
 
وشكراً☺

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

أما في 30 آذار 2008 04:50 م، فقد تنهد ياسر أبوبكر بارتياح وهو يرد:

يوجد في السي شارب كلاس يدعى (stopwatch) بإمكانه أن يفعل ذلك ويقيس الزمن باملي ثانية لكن المشكلة أن زمن تنفيذ التعليمات التي لدي صغير جدا (يمكن أن يقاس بالنانو ثانية) ...
لهذا فإن كثيراً من المبرمجين يقومون بتنفيذ التعليمات المراد قياسها عدد كبير من المرات (بالملايين أحياناً) ثم يقومون بتقسيم الزمن الكلي على عدد المرات للحصول على الزمن المطلوب


في 30 آذار 2008 04:50 م، غمغم ياسر أبوبكر باستغراب قائلاً:

 ويوجد كلاس اخر يدعى (QueryPrefCounter) ولكنه لم يفدني كثيرا لأن قيمه غير دقيقة
أذكر أن هذه الطريقة تحتاج إلى "تحمية" وذلك بنداء الإجراء مرة أو اثنتين قبل قراءة القيمة الحقيقة. لكن قد أكون مخطئاً
 
تعديل: لقد وجدت مقالة في موقعنا هذا: http://www.agdn-online.com/papers/mmio.htm تتحدث عن هذه المؤقتات وغيرها. بمكنك الإطلاع عليها لمعرفة تفاصيل أكثر. يبدو أن موضوع التحمية لا يطبق في طريقة الـ QueryPrefCounter بل في طريقة أخرى. ربما أحتاج لبعض النوم☺
حقاً هناك مقالات رائعة في هذا الموقع ;)

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

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

في 30 آذار 2008 05:38 م، غمغم سلوان الهلالي باستغراب قائلاً:

عند تنفيذ برنامج دوت نت, يقوم المترجم الفوري JIT-Compiler بتحويل تعليمات لغة دوت نت الوسطية المسمات MSIL إلى تعليمات إعتيادية (Native) أي إن البرنامج الذي سيتم تنفيذهه فعلياً مشابه بشكل كبير لبرنامج سي++ إعتيادي. ولكن يضاف لها أشياء مثل جامع النفايات Garbage Collector وأشياء أخرى خاصة بدوت نت...
يمكننا الدخول في نقاش مطول هنا. لكن بشكل مختصر فإن عملية الترجمة من MSIL إلى Native Machine Code نفسها تضرب الأداء سواءً عند تحميل البرنامج أو عندما يصل الـ JIT-Compiler إلى قسم من البرنامج لم يترجم عند التحميل.أيضاً فإن الـ GC يعمل كل فترة مما يشكل Spikes في تنفيذ البرنامج. وقد يقرر ألا يعمل أبداً مما يجعل برنامجاً بسيطاً يحجز عدداً محترماً من الميغا بايتات بعد فترة من تنفيذه. أخيراً فأن الأشياء الخاصة بالـ .NET والتي تفيد كثيراً في الـ security و جعل نسبة حدوث الأخطاء البرمجية أقل هي نفسها قد تضرب الأداء. كمثال على ذلك الاختبار على الحدود Bounds Checking عند كل وصول لعنصر في مصفوفة.
هناك أيضاً موضوع أن البرامج المبنية باستخدام C# هي شئنا أم أبينا تحت رحمة Microsoft.



بتاريخ 30 آذار 2008 05:38 م، قطب سلوان الهلالي حاجبيه بشدة وهو يقول:

ذلك هو السبب في إن برامج دوت نت قريبة من أداء برامج سي++ بل في بعض الحالات.. تتفوق عليها!!
سمعت هذه المقولة أكثر من مرة. وأود حقاً التبحر على هذه النقطة. هل لديك مثال عن ذلك؟

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

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

في 30 آذار 2008 07:32 م، عقد عبد اللطيف حاجي علي حاجبيه بتفكير وقال:

يمكننا الدخول في نقاش مطول هنا. لكن بشكل مختصر فإن عملية الترجمة من MSIL إلى Native Machine Code نفسها تضرب الأداء سواءً عند تحميل البرنامج أو عندما يصل الـ JIT-Compiler إلى قسم من البرنامج لم يترجم عند التحميل.أيضاً فإن الـ GC يعمل كل فترة مما يشكل Spikes في تنفيذ البرنامج. وقد يقرر ألا يعمل أبداً مما يجعل برنامجاً بسيطاً يحجز عدداً محترماً من الميغا بايتات بعد فترة من تنفيذه. أخيراً فأن الأشياء الخاصة بالـ .NET والتي تفيد كثيراً في الـ security و جعل نسبة حدوث الأخطاء البرمجية أقل هي نفسها قد تضرب الأداء. كمثال على ذلك الاختبار على الحدود Bounds Checking عند كل وصول لعنصر في مصفوفة.

مقابل سهولة أكثر في التطوير, نخسر بعض الأداء☺
 

وفي 30 آذار 2008 07:32 م، قال عبد اللطيف حاجي علي متحمساً:

هناك أيضاً موضوع أن البرامج المبنية باستخدام C# هي شئنا أم أبينا تحت رحمة Microsoft.
 
هنالك Mono أيضاً, ويتم الإشراف عليه من قبل Novell, الهدف من وراءه هو صنع مجموعة ادوات متوافقة مع دوت نت, حيث إنه يحتوي على مترجم #C, محرك JIT كامل, و Common Language Runtime ويعمل على Windows, *nix, MacOSX, Solaris, BSD وهو مفتوح الشفرة.
بالتأكيد هو ليس بقدرات مكافئة لقوة الدوت نت في الوندوز... ولكنه قريب بشكل كافي.
موقع مشروع مونو: http://www.mono-project.com/
 



وفي 30 آذار 2008 07:32 م، ظهر شبح ابتسامة على وجه عبد اللطيف حاجي علي وهو يقول:

سمعت هذه المقولة أكثر من مرة. وأود حقاً التبحر على هذه النقطة. هل لديك مثال عن ذلك؟

سأتراجع هنا عن وجهة نظري المتفائلة...لا أعتقد إن هنالك أي طريقة لدوت نت لكي يهزم كود مكتوب بإستخدام ++C بشكل جيد ومجهز لتقديم أداء مرتفع, ولكن إذا لم يكن كود ++C مكتوباً بطريقة جيدة وليس مجهز خصيصاً لتقديم أداء مرتفع (كما في كثير من الأحيان), قد يمكن للدوت نت أن يهزمه...
كذلك لا أعتقد إن من الممكن إعطاء رقم ثابت يمثل الفرق بالأداء بين الإثنين, قرأت في بعض الأماكن إن دوت نت تقدم 90% من أداء native code. ولكن ذلك ليس صحيح في جميع الحالات, قد يهبط ذلك الرقم كثيراً في بعض المهام. مثلاً عملية بناء وإدارة terrain يدعم التقنيات التقليدية (geo-mipmapping, clod, ...) والتي كما تعرف تقوم بمعظم عملياتها على المعالج المركزي, لا أعتقد إنه يمكن الوصول لأداء يقارب 90% بإستخدام دوت نت فقط.
ولكن قد أكون مخطئاً☺
 
أتذكر إني قرأت ما يشبه الدراسة الكاملة عن أداء دوت نت مقارنة مع native, والكاتب يتكلم من وجهة نظر برمجة الرسوميات, يحاول خلالها كتابة كود يقوم بالعمليات الأساسية ذات الوزن الثقيل (matrix multiplication, vector magnitude,...) بإستخدام دوت نت بحيث يقترب من أداء الـ native, أو حتى يهزمه... وأعتقد إنه توصل إلى إستنتاجات رائعة.
إنظر: http://scapecode.com/

موهوب  ياسر أبوبكر مشاركة 6

شكرا جزيلا لكل الأعضاء الذين ساهموا في هذا الموضوع لقد تعرفت على معلومات جيدة منكم
 
ولم أكن أتوقع أن يتحول هذا السؤال إلى موضوع للنقاش
 
يبدو أن السؤال كان أعمق مماكنت أتصور
 
 
ولكن بالرغم من ذلك لم أجد إجابة لسؤال بعد!
 
هل هناك تعليمات أو كلاسات (أو أي طريقة أخرى غير التي ذكرتها سابقا) لحساب زمن تنفيذ التعليمات؟

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

وفي 31 آذار 2008 02:44 م، قال ياسر أبوبكر متحمساً:

هل هناك تعليمات أو كلاسات (أو أي طريقة أخرى غير التي ذكرتها سابقا) لحساب زمن تنفيذ التعليمات؟

هنالك الأداة المسماة بالـ profiler, تستطيع إستخدام هكذا أداة لمتابعة التنفيذ والحصول على معلومات مفصلة عن نشاطات الذاكرة وزمن التنفيذ, هنالك مثلاً أداة الـ CLR Profiler من مايكروسوفت, قد تكون ما تبحث عنه (هذه النسخة مخصصة لـ 2.0 NET.):
http://www.microsoft.com/downloads/details.aspx?FamilyId=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en
 
تحياتي لك

موهوب  ياسر أبوبكر مشاركة 8

وفي 24/ربيع الأول/1429 01:14 م، ظهر شبح ابتسامة على وجه سلوان الهلالي وهو يقول:

هنالك الأداة المسماة بالـ profiler, تستطيع إستخدام هكذا أداة لمتابعة التنفيذ والحصول على معلومات مفصلة عن نشاطات الذاكرة وزمن التنفيذ, هنالك مثلاً أداة الـ CLR Profiler من مايكروسوفت, قد تكون ما تبحث عنه (هذه النسخة مخصصة لـ 2.0 NET.):
http://www.microsoft.com/downloads/details.aspx?FamilyId=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en
 

شكرا جزيلا لك☺
 



أما في 24/ربيع الأول/1429 01:14 م، فقد تنهد سلوان الهلالي بارتياح وهو يرد:

تحياتي لك

الله يحيك