لم يتم بدء تشغيل التطبيق على لينكس أبطأ عند استخدام مشترك يبس?

StackOverflow https://stackoverflow.com/questions/1410691

  •  05-07-2019
  •  | 
  •  

سؤال

على جزءا لا يتجزأ من جهاز أعمل عليه وقت بدء التشغيل هو مسألة هامة.التطبيق بالكامل يتكون من عدة التنفيذية التي تستخدم مجموعة من المكتبات.لأن مساحة في ذاكرة فلاش محدودة نود أن استخدام المكتبات المشتركة.

تطبيق workes كالعادة عندما تم تجميعها وربطها مع المكتبات المشتركة ومقدار ذاكرة فلاش هو انخفاض كما هو متوقع.الفرق ان النسخة التي ترتبط ثابت يبس هو أن وقت بدء التطبيق حوالي 20 أطول وليس لدي أي فكرة عن السبب.

التطبيق يعمل على ARM9 وحدة المعالجة المركزية في 180 MHz مع لينكس 2.6.17 OS ، 16 ميغابايت فلاش (JFFS نظام الملفات) و 32 ميغابايت من ذاكرة الوصول العشوائي.

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

المحلول

لان المكتبات المشتركة يجب أن تكون مرتبطة في وقت التشغيل ، عادة عن طريق dlopen() أو شيئا من هذا القبيل.لا يوجد مثل هذه الخطوة مكتبات ثابتة.

تحرير:بعض مزيد من التفاصيل.dlopen أداء المهام التالية.

  • تجد المكتبة المشتركة
  • تحميل إلى الذاكرة
  • بشكل متكرر تحميل جميع التبعيات (و التبعيات....)
  • حل جميع الرموز

هذا يتطلب الكثير جدا من عمليات IO إلى تحقيقه.

في ثابت ربط البرنامج كل ما سبق يتم في تجميع الوقت ليس وقت التشغيل.ولذلك أسرع بكثير لتحميل مرتبطة بشكل ثابت البرنامج.

في حالتك الفرق مبالغ فيه من قبل بطيئة نسبيا الأجهزة التعليمات البرمجية يجب أن تعمل على.

نصائح أخرى

هذا هو مثال جيد الكلاسيكية المفاضلة السرعة والمكان.

يمكنك ثابت الرابط كل ما تبذلونه من الملفات التنفيذية بحيث تكون أسرع ولكن ثم أنها سوف تأخذ مساحة أكبر

أو

هل يمكن أن يكون المكتبات المشتركة التي تأخذ مساحة أقل ولكن أيضا المزيد من الوقت لتحميل.

حتى تقرر ما تريد أن تضحي.

هناك العديد من عوامل هذا الاختلاف (OS, مترجم e.t.ج) ولكن قائمة جيدة من الأسباب التي يمكن العثور عليها هنا.أساسا المكتبات المشتركة التي تم إنشاؤها في الفضاء الأسباب و الكثير من "السحر" تشارك لجعلها تعمل يأخذ الأداء ضرب.

(كما التاريخي ملاحظة الأصلية Netscape navigator على لينكس/يونكس كانت مرتبطة بشكل ثابت كبيرة من الدهون القابلة للتنفيذ).

وهذا قد يساعد الآخرين الذين يعانون من مشاكل مماثلة:

والسبب استغرق وقتا طويلا بدء التشغيل في وكانت حالتي، أن الإعداد الافتراضي من دول مجلس التعاون الخليجي لتصدير جميع الرموز من داخل المكتبة. تحسن كبير هو تعيين إعداد المترجم "-fvisibility = الخفية".

ولقد لستضاف إلى جميع الرموز التي ليب أن تصدير مع بيان

و__attribute__ ((visibility("default")))

دول مجلس التعاون الخليجي ويكي
ومقال جيد جدا كيفية كتابة مكتبات المشتركة

حسنا، لقد تعلمت الآن أن استخدام المكتبات المشتركة وانها disadvatages حيث السرعة. لقد وجدت هذه المقالة حول ديناميكي ربط وتحميل enlighting. ويبدو أن عملية التحميل لتكون أطول بكثير مما كنت أتوقع.

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

وهكذا، آسف لا يسعني القول لماذا، لكني أعتقد أن لها قضية مع الجهاز ARM / OS. هل حاولت instrumenting رمز بدء التشغيل، أو ربط بشكل ثابت مع 1 من المكتبات الأكثر استخداما لمعرفة ما إذا كان يحدث فرقا كبيرا. أيضا وضع يبس المشتركة في نفس الدليل التطبيق لتقليل الوقت الذي يستغرقه للبحث في FS للتحرر.

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

وانه من السهل جدا أن الجمع بين عدة التنفيذية في نفس واحد، عادة مجرد دراسة ARGV والتي تقرر روتين لاستدعاء بناء على ذلك.

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