سؤال

وهناك الكثير من رأس المال C عاصمة S علوم الكمبيوتر الخوض جافا سكريبت عن طريق مشاريع جافا، Squirrelfish، وV8. هل أي من هذه المشاريع (أو غيرها) معالجة أداء عمليات DOM، أو هم حساب جافا سكريبت البرمجية بحتة ذات الصلة؟

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

المحلول

وأداء العمليات DOM نقية (getElementById / اسم العلامة / محدد، nextChild، الخ) هي تتأثر كما انهم بالفعل في الخالص C ++.

وكيف التحسينات محرك JS سوف يؤثر على الأداء لا يعتمد إلى حد ما على تقنيات معينة تستخدم لتحسين الأداء، فضلا عن أداء الجسر DOM-> JS.

ومثال الأول هو الاعتماد جافا على جميع المكالمات يجري إلى وظائف JS. لأن أثر فعال inlines طريق تنفيذ أي نقطة حيث JS يضرب التعليمات البرمجية التي لا يمكن inlined (رمز الأصلي، العودية متعددة الأشكال الحقيقية، مناولات استثناء) التتبع هو إحباط وتنفيذ يرتد إلى مترجم. المطورين TM يفعلون الكثير من العمل لتحسين كمية من التعليمات البرمجية التي يمكن أن تعزى (بما في ذلك التعامل مع العودية متعددة الأشكال) تتبع ولكن واقعيا عبر المكالمات إلى وظائف الأم التعسفية (على سبيل المثال. وDOM) ليس ممكنا. لهذا السبب أعتقد أنهم يبحثون في تنفيذ أكثر من DOM في JS (أو على الأقل بطريقة ودية JS). وقال أنه عندما متاحة ارجاعها TM يمكن القيام بعمل جيد للغاية كما أنه يمكن خفض معظم "الأجسام" لأكثر كفاءة و / أو مواطن حكمه (على سبيل المثال استخدام [إينتس] آلة بدلا من تنفيذ عدد JS).

وJavaScriptCore (والذي هو المكان الذي يعيش SquirrelFish المتطرفة) وV8 اتباع نهج أكثر مماثل في أن كلا منهما JIT كل JS متاحة على الفور وإنتاج التعليمات البرمجية التي هي أكثر المضاربة (على سبيل المثال إذا كنت تفعل a*b أنها تولد التعليمات البرمجية التي يفترض a و b هي الأرقام ويرتد إلى رمز بطيئة للغاية إذا لم تكن). وهذا له عدد من الفوائد على البحث عن المفقودين، وهي التي يمكن أن جيت كل رمز، بغض النظر ما إذا كان أو لم يكن يدعو التعليمات البرمجية الأصلية / يلقي الاستثناءات، وما إلى ذلك، مما يعني أن مكالمة DOM واحدة لا تدمر الأداء. الجانب السلبي هو أن كل رمز هو المضاربة - TM <م> سوف مضمنة يدعو إلى Math.floor، وما إلى ذلك، ولكن أفضل JSC / V8 يمكن القيام به يكون معادلا لa=Math.floor(0.5) -> a=(Math.floor == realFloor) ? inline : Math.floor(0.5) هذا له التكاليف سواء في الأداء واستخدام الذاكرة، كما أنه ليس ممكنا بشكل خاص. والسبب في ذلك هو تجميع خط الهجوم، في حين TM فقط كود JITs بعد أن يتم تشغيله (وهكذا يعرف بالضبط ما تم استدعاء الدالة) JSC وV8 ليس لها أساس حقيقي لجعل مثل هذا الافتراض، ويجب أن تخمين (وحاليا لا محاولات الأساس هذه). الشيء الوحيد الذي V8 وJSC القيام به لمحاولة تعويض عن هذه المشكلة هو تتبع ما رأيت في الماضي، وإدراج ذلك في طريق التنفيذ، على حد سواء استخدام مجموعة من التقنيات للقيام بذلك التخزين المؤقت، في حالات خاصة الساخنة انهم إعادة كتابة أجزاء صغيرة من تيار تعليمات، وفي حالات أخرى أنها تبقي من مخابئ الفرقة. وعموما إذا كان لديك التعليمات البرمجية التي يذهب

a.x * a.y

وV8 وJSC سوف تحقق من 'نوع الضمني' / 'هيكل' مرتين - مرة واحدة لكل الوصول، ثم تأكد من أن a.x وa.y كلاهما الأرقام، في حين TM وإنشاء التعليمات البرمجية التي يتحقق نوع من a مرة واحدة فقط، ويمكن أن (كل شيء يجري على قدم المساواة) فقط مضاعفة a.x وa.y دون التحقق أنهم الأرقام.

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

وكانت المسألة الأخرى التي ذكرتها في DOM <-> JS تكلفة ملزمة - وهذا يمكن أن تقوم به في الواقع جزء كبير جدا في الأداء على شبكة الإنترنت، وأفضل مثال على ذلك هو سفاري 3.1 / 2 ضد الكروم في المؤشر Dromaeo. ويستند الكروم الخروج من فرع سفاري 3.1 / 2 من بكت لذلك فمن آمن بشكل معقول لنفترض DOM مماثلالأداء (الفرق مترجم يمكن أن يسبب قدرا من التباين). في هذا سفاري القياسي 3.1 / 2 في الواقع يدق كروم على الرغم من وجود محرك JS ذلك بشكل واضح من ذلك بكثير أبطأ بكثير، وهذا هو في الأساس بسبب الارتباطات أكثر كفاءة بين JSC / WebCore (دوم / تقديم / الخ من بكت) وV8 / WebCore

وتبحث حاليا في الارتباطات DOM TM ويبدو غير عادلة لأنها لم تستكمل كل العمل الذي تريد القيام به (للأسف) لذلك هم فقط يرتد على المترجم: - (

..

وErrmmm، التي استمرت لمدة أطول مما كانوا ينوون إجابة قصيرة جدا إلى السؤال الأصلي هو "الامر يتوقف": D

نصائح أخرى

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

وDOM الأمثل هو "غلاية نوثر كاملة من <الإضراب> السناجب <الإضراب> القرود <الإضراب> العناكب الأسماك ... تخطيط والمحركات حتى تقديم تأتي في اللعب، وكل متصفح لديها استراتيجية التنفيذ والتحسين الخاصة بهم.

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