سؤال

هل استخدم أي شخص هنا من أي وقت مضى Ngen؟ أين؟ لماذا ا؟ هل كان هناك أي تحسين أداء؟ متى وأين معنى أن تستخدمه؟

هل كانت مفيدة؟

المحلول

نعم، لقد رأيت تحسينات الأداء. وأشارت قياساتي إلى أنها تتحسن أداء بدء التشغيل إذا وضعت أيضا تجمعاتي في GAC لأن تجمعي كلها تسمى جميعها. إذا كانت تجمعاتك قوية تسمى، فلن تحدث Ngen أي فرق دون استخدام GAC. السبب في ذلك هو أنه إذا كان لديك تجميعات قوية مسماة غير موجودة في GAC، فستصيد وقت التشغيل .NET أن تجميعك القوي المسماي لم يتم العبث به عن طريق تحميل الجمعية بالكامل من القرص، بحيث يمكن التحقق منه التحايل واحدة من الفوائد الرئيسية من ngen.

لم يكن هذا خيارا جيدا للغاية لطلبي لأننا نعتمد على جمعيات مشتركة من شركتنا (التي هي أيضا اسمه قوي). يتم استخدام التجمعات المشتركة من قبل العديد من المنتجات التي تستخدم العديد من الإصدارات المختلفة، مما يضعها في GAC يعني أنه إذا لم تقل واحدة من تطبيقاتنا "استخدام إصدار محدد" من إحدى التجمعات الشائعة التي ستحميل إصدار GAC بغض النظر عن ماذا كان الإصدار في دليل التنفيذ. قررنا أن فوائد Ngen لم تكن تستحق المخاطر.

نصائح أخرى

أنا لا أستخدمه يوما بعد يوم، ولكن يتم استخدامه بالأدوات التي ترغب في زيادة الأداء؛ على سبيل المثال، يستخدم Paint.net Ngen أثناء المثبت (أو ربما استخدم أولا). من الممكن (على الرغم من أنني لا أعرف بالتأكيد) أن بعض أدوات MS تفعل، أيضا.

في الأساس، ينفجر Ngen الكثير من JIT لجمعية مقدمة، بحيث يكون هناك القليل جدا من التأخير في بداية باردة. بالطبع، في معظم الاستخدام النموذجي، لا يتم الوصول إلى 100٪ من التعليمات البرمجية، لذلك في بعض الطرق هذا يفعل الكثير من غير ضروري العمل - لكن لا يمكن أن يخبر ذلك في وقت مبكر.

الجانب السلبي، IMO، هو أنك تحتاج إلى استخدام GAC لاستخدام Ngen؛ أحاول تجنب GAC قدر الإمكان، بحيث يمكنني استخدام النشر Robocopy (إلى الخوادم) والنقر (للعملاء).

تقلل Ngen بشكل أساسي من وقت بدء تشغيل التطبيق .NET التطبيق ومجموعة عمل التطبيق. ولكن ليس لديها بعض العيوب (من CLR عبر C # من جيفري ريختر):

لا حماية الملكية الفكرية

يمكن أن تخرج ملفات ngen'd من المزامنة

أداء وقت التحميل السفلي (Rebasing / BIDING)

أداء وقت التنفيذ السفلي

نظرا لجميع المشكلات المدرجة فقط، يجب أن تكون حذرا للغاية عند النظر في استخدام Ngen.exe. بالنسبة لتطبيقات جانب الخادم، لا معنى NGEN.EXE ضئيلا أو معدوما لأن طلب العميل الأول فقط يختبر ضرب الأداء؛ طلبات العميل المستقبلية تعمل بسرعة عالية. بالإضافة إلى ذلك، للحصول على معظم تطبيقات الخوادم، مطلوب مثيل واحد فقط من التعليمات البرمجية، لذلك لا توجد فائدة مجموعة العمل.

بالنسبة لتطبيقات العميل، قد يكون Ngen.exe معنى لتحسين وقت بدء التشغيل أو تقليل مجموعة العمل إذا تم استخدام تجميع من قبل تطبيقات متعددة في وقت واحد. حتى في الحالة التي لا تستخدم فيها تجميعها من قبل تطبيقات متعددة، يمكن أن تقوم Ngen'ing بتجميع تحسين مجموعة العمل. علاوة على ذلك، إذا تم استخدام Ngen.exe لجميع تجميعات تطبيق العميل، فلن يحتاج CLR إلى تحميل مترجم JIT على الإطلاق، مما يؤدي إلى تقليل مجموعة العمل. بالطبع، إذا لم تكن مجموعة واحدة فقط ليست Ngen'd أو إذا كان لا يمكن استخدام ملف Ngen'd للمجمع، فسيتم تحميل مترجم JIT، ويزيد مجموعة عمل التطبيق.

ngen يعرف معظمهم تحسين وقت بدء التشغيل (عن طريق القضاء على مجموعة JIT). قد يتحسن (عن طريق تقليل وقت JIT) أو تقليل الأداء العام للتطبيق (نظرا لأن بعض تحسينات JIT لن تكون متاحة).

.NET Framework نفسه يستخدم ngen بالنسبة للعديد من الجمعيات عند التثبيت.

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

لكن اسمحوا لي أن أقول لك تجميع JIT ليس سيئا للغاية وإذا كان لديك نشر عبر بيئات وحدة المعالجة المركزية متعددة (على سبيل المثال تطبيق عميل Windows يتم تحديثه في كثير من الأحيان)، فلا تستخدم Ngen. هذا COZ يعتمد ذاكرة التخزين المؤقت Ngen الصالحة على العديد من السمات. إذا فشل أحد هذه الأشياء، تعود تجميعك إلى JIT مرة أخرى

JIT هو فائز واضح في مثل هذه الحالات، لأنه يحسن التعليمات البرمجية على الطيران المستندة إلى بنية وحدة المعالجة المركزية التي تعمل عليها. (على سبيل المثال، يمكن أن يكتشف ما إذا كان هناك المزيد من وحدة المعالجة المركزية 1

و CLR تتحسن مع كل الإفراج، لذلك في عصا قصيرة مع JIT ما لم تكن متأكدا من بيئة النشر الخاصة بك - حتى بعد ذلك، فإن مكاسب أداءك لن تبرير باستخدام Ngen.exe (ربما تكون المكاسب في بضع مئات MS) - IMHO - انها لا تستحق الجهود

تحقق أيضا من الرابط الحقيقي هذا على هذا الموضوع - جيت تجميع والأداء - إلى ngen أم لا إلى ngen؟

نعم. تستخدم في تطبيق WPF لتسريع وقت بدء التشغيل. ذهب وقت بدء التشغيل من 9 ثوان إلى 5 ثوان. اقرأ عن ذلك في بلدي مقالات :

لقد اكتشفت مؤخرا كيف يمكن أن تكون Ngen كبيرة للأداء. التطبيق الذي أعمل حاليا لديه طبقة وصول إلى البيانات (DAL) التي يتم إنشاؤها. مخطط قاعدة البيانات كبير جدا، ونحن نولد أيضا بعض البيانات (قائمة القيم) مباشرة في دال. النتيجة: العديد من الفصول مع العديد من الحقول، والعديد من الطرق. غالبا ما تظهر JIT Overhead في كثير من الأحيان عند تنميط التطبيق، ولكن بعد بحث على Jit Compring و Ngen I على الرغم من أنه لم يكن يستحق كل هذا العناء. تسليم وقت التثبيت، مع إدارة مخاوفي الكبرى، جعلني أتجاهل العلامات والتركيز على إضافة المزيد من الوظائف إلى التطبيق بدلا من ذلك. عندما غيرنا الهندسة المعمارية إلى "أي وحدة المعالجة المركزية" تعمل على آلات 64 بت، أصبحت الأمور أسوأ: لقد عانينا شنق في طلبنا لمدة تصل إلى 10 ثوان على بيان واحد، مع عرض ملف التعريف فقط JIT Qualhead على منطقة المشكلة. حل Ngen المشكلة: ذهب البيان من 10 ثوان إلى 1 مللي ثانية. لم يكن هذا البيان جزءا من إجراء بدء التشغيل، لذلك كنت حريصا على معرفة ما يمكن أن يفعله التطبيق بالكامل لوقت بدء التشغيل. ذهبت من 8 ثوان إلى 3.5 ثانية.

الخلاصة: أنا أوصي حقا إعطاء ngen محاولة على طلبك!

كإضافة إلى تعليق Mehrdad Afshari حول مجموعة JIT. إذا كان تسلسل فئة مع العديد من الخصائص عبر Xmlserializer وعلى نظام 64 بت SGEN، فإن التحرير والسرد Ngen لديه تسربت (في حالة جيجابايت والدقائق الخاصة بنا).

مزيد من المعلومات هنا:خسارة Xmlserializer فقدان أداء ضخمة على أنظمة 64 بت انظر إجابة نيك مارتشينكو خاصة.

نعم، لقد جربت ذلك مع exe مكثف وحيد وحدة المعالجة المركزية الصغيرة ومع نغان كان أبطأ قليلا!

لقد قمت بتثبيت وإزالة تثبيت صورة Ngen عدة مرات وركض معيارا.

حصلت دائما على الأوقات التالية قابلة للتخصيص +/- 0.1s: 33.9s بدون، 35.3s مع

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top