لمحة عامة عن جافا

فايرفوكس 3.5 لديه الجديد محرك جافا سكريبت، جافا، التي تدير العديد من برامج جافا سكريبت 3-4x أسرع من فايرفوكس 3، وتسريع التطبيقات القائمة على الشبكة العالمية، وتمكين جديدة. وهذه المادة تعطي نظرة خاطفة تحت الغطاء في أجزاء كبيرة من جافا وكيف تسريع شبيبة. وهذا يفسر أيضا ما هي أنواع البرامج في الحصول على أفضل من تسريع جافا وأنواع الأشياء التي يمكن القيام به للحصول على البرنامج الخاص بك لتشغيل أسرع.
لماذا من الصعب تشغيل شبيبة سريع: الطباعة ودينامية
على مستوى عال لغات ديناميكية مثل جافا سكريبت وبيثون جعل برمجة أكثر إنتاجية، لكنها كانت دائما بطيئة مقارنة مع لغات كتابتها بشكل ثابت مثل جافا أو جيم وهناك قاعدة نموذجية من الإبهام هو أن برنامج شبيبة قد يكون 10X أبطأ من برنامج جافا يعادل .
هناك نوعان من الأسباب الرئيسية شبيبة وغيرها من لغات البرمجة الديناميكية تشغيل عادة أبطأ من جافا أو جيم والسبب الأول هو أن في لغات ديناميكية فهو عموما ليس من الممكن تحديد أنواع القيم في وقت مبكر. بسبب هذا، يجب أن لغة تخزين جميع القيم في شكل عام والقيم العملية باستخدام العمليات النوعية.
في جاوة، على النقيض من ذلك، مبرمج تعلن أنواع للمتغيرات والأساليب، وبالتالي فإن المترجم يمكن تحديد أنواع القيم في وقت مبكر. لا يمكن للمترجم ثم توليد التعليمات البرمجية التي تستخدم صيغ المتخصصة والعمليات التي تعمل أسرع بكثير من العمليات النوعية. سأطلق على هذه العمليات من نوع متخصص.
والسبب الثاني الرئيسي الذي لغات ديناميكية تشغيل أبطأ هو أن تنفذ عادة لغات البرمجة مع المترجمين، في حين يتم تصنيف لغات كتابتها بشكل ثابت إلى التعليمات البرمجية الأصلية. مترجمين من الأسهل خلق، لكنها تحمل النفقات الإضافية وقت لتتبع حالتها الداخلية. لغات مثل جافا ترجمة إلى لغة الآلة، الأمر الذي يتطلب تقريبا تتبع الدولة لا في سماء المنطقة.
دعونا نجعل هذا مع صورة ملموسة. وهنا هي التباطؤ في شكل صورة لعملية بسيطة إضافة رقمية: a + b ، حيث a و b أعداد صحيحة. الآن، وتجاهل شريط أقصى اليمين، والتركيز على المقارنة بين مترجم جافا سكريبت فايرفوكس 3 مقابل 1 JIT جاوة. كل عمود يبين الخطوات التي يتعين القيام به لإكمال عملية الإضافة في كل لغة البرمجة. الوقت يمضي نحو الانخفاض، وارتفاع كل مربع يتناسب مع الوقت الذي يستغرقه الانتهاء من الخطوات في المربع.
في الوسط، جافا يعمل ببساطة من تعليمة لغة الآلة الوظيفة، التي تدير في الوقت T (دورة واحدة المعالج). لأن المترجم جافا يعلم أن المعاملات هي أعداد صحيحة آلة القياسية، فإنه يمكن استخدام معيار صحيح لغة الآلة إضافة التعليمات. هذا هو.
على اليسار، SpiderMonkey (المترجم شبيبة في FF3) يستغرق نحو 40 أضعاف طويلة. خانات البني فوق مترجم: المترجم يجب قراءة عملية الإضافة والقفز إلى رمز المترجم عن الوظيفة العامة. صناديق البرتقال تمثل العمل الاضافي الذي يتعين القيام به، لأن المترجم لا يعرف أنواع المعامل. المترجم أن فك تمثيل عام من a و i ، ومعرفة أنواعها، وحدد تشغيل إضافة محدد، وتحويل القيم إلى أنواع اليمين، وعند نهاية، تحويل النتيجة مرة أخرى إلى شكل عام.
الرسم البياني يظهر ان استخدام مترجم بدلا من مترجم وتبطئ قليلا، ولكن ليس لديها معلومات نوع وتبطئ كثيرا. إذا كنا نريد شبيبة لتشغيل أكثر من أسرع قليلا مما كان عليه في FF3، بواسطة قانون أمدال و ، يتعين علينا أن نفعل شيئا حيال أنواع.
الحصول على أنواع من البحث عن المفقودين
هدفنا في جافا هو تجميع نوع المتخصصة رمز. للقيام بذلك، جافا يحتاج إلى معرفة أنواع من المتغيرات. لكن جافا سكريبت ليس لديها تعريفات نوع، وقلنا أيضا أنه من المستحيل عمليا لمحرك شبيبة لمعرفة أنواع في وقت مبكر. إذا كان الأمر كذلك نريد أن يجمع كل شيء في وقت مبكر، نحن عالقون.
لذلك دعونا تحويل مشكلة حولها. إذا تركنا تشغيل البرنامج قليلا في مترجم، لا يمكن للمحرك مراقبة مباشرة على أنواع من القيم. ثم، لا يمكن للمحرك استخدام تلك الأنواع لتجميع سريع من نوع المتخصصة رمز. أخيرا، يمكن للمحرك بدء تشغيل التعليمات البرمجية النوع المتخصصة، وأنها سوف تعمل بشكل أسرع من ذلك بكثير.
هناك بعض التفاصيل الأساسية حول هذه الفكرة. أولا، عند تشغيل البرنامج، حتى لو كانت هناك العديد من إذا كانت تصريحات والفروع الأخرى، من أن البرنامج يذهب دائما طريقة واحدة فقط. وبالتالي فإن المحرك لا يحصل لمراقبة أنواع لأسلوب كامل - محرك يلاحظ من خلال أنواع من المسارات، والتي نسميها آثار، أن البرنامج يأخذ في الواقع. وهكذا، بينما القائمون على مستوى تجميع الأساليب، جافا يجمع آثار. واحدة من الفوائد الجانبية النزرة في وقت واحد في مجموعة هي أن inlined المكالمات الدالة التي تقع على أي أثر، مما يجعل وظيفة تتبع المكالمات سريع جدا.
الثانية، وتجميع نوع المتخصصة رمز يستغرق وقتا طويلا. إذا قطعة من رمز هو الذهاب الى تشغيل واحد فقط أو عدة مرات، وهو أمر شائع مع رمز الشبكة، يمكن أن يستغرق بسهولة مزيد من الوقت لترجمة وتشغيل رمز من انها ستتخذ لتشغيل ببساطة رمز في مترجم. لذلك يدفع فقط إلى ترجمة التعليمات البرمجية ساخن (رمز التي يتم تنفيذها عدة مرات). في جافا، ونحن ترتيب هذا من خلال تتبع حلقات فقط. جافا يعمل في البداية كل ما في والمترجم، وتبدأ آثار التسجيل من خلال حلقة بمجرد أن تحصل على الساخن (تدير أكثر من بضع مرات).
تتبع حلقات فقط ساخن يحتوي على نتيجة مهمة: رمز التي يتم تنفيذها إلا في أوقات قليلة لن تسرع في جافا. لاحظ أن هذه عادة لا يهم في الواقع العملي، وذلك لأن التعليمات البرمجية التي يعمل إلا في أوقات قليلة وعادة ما يعمل سريع جدا ليكون ملحوظا. نتيجة أخرى هو أن المسارات من خلال حلقة التي لم يتم اتخاذها على جميع أبدا في حاجة إلى أن تجمع، وتوفير الوقت الترجمة.
أخيرا، وقبل ذلك قال نحن جافا الأرقام إلى أنواع من القيم من خلال مراقبة التنفيذ، ولكن كما نعلم جميعا، والأداء في الماضي لا يضمن النتائج المستقبلية: لأنواع قد تكون مختلفة في المرة التالية يتم تشغيل التعليمات البرمجية، أو 500 مرة المقبل. وإذا كان لنا أن محاولة تشغيل التعليمات البرمجية التي تم جمعها للأرقام عندما تكون القيم هي في الواقع سلاسل، فإن الأمور سيئة للغاية أن يحدث. لذلك يجب إدراج جافا نوع الشيكات في التعليمات البرمجية المترجمة. إذا كان الشيك لا يمر، ويجب ترك جافا التتبع الحالية وتجميع تتبع جديد لأنواع جديدة. هذا يعني أنه رمز مع العديد من الفروع أو التغييرات نوع يميل لتشغيل أبطأ قليلا في جافا، لأنه يستغرق وقتا طويلا لتجميع آثار اضافية والقفز من واحد إلى آخر.
جافا في العمل
الآن، سوف نعرض البحث عن المفقودين في الإجراءات التي تتخذها مثال على هذا البرنامج عينة، والتي تضيف الأرقام أولا N كامل لقيمة البداية:

 function addTo(a, n) {
   for (var i = 0; i < n; ++i)
     a = a + i;
   return a;
 }
 
 var t0 = new Date();
 var n = addTo(0, 10000000);
 print(n);
 print(new Date() - t0);


جافا دائما يبدأ تشغيل البرنامج في مترجم. في كل مرة يبدأ البرنامج حلقة التكرار، جافا يدخل لفترة وجيزة طريقة الرصد لزيادة عداد لذلك حلقة. في FF3.5، عندما العداد إلى 2، وتعتبر حلقة ساخنة وحان الوقت لتعقب.
الآن جافا لا تزال تعمل في مترجم ولكن يبدأ تسجيل التتبع باعتباره رمز يعمل. تتبع ببساطة التعليمات البرمجية التي تدير حتى نهاية الحلقة، جنبا إلى جنب مع الأنواع المستخدمة. ويتم تحديد أنواع من خلال النظر في القيم الفعلية. في مثالنا، حلقة تنفيذ هذه السلسلة من البيانات جافا سكريبت، والتي يصبح التتبع لدينا:

    a = a + i;    // a is an integer number (0 before, 1 after)
    ++i;          // i is an integer number (1 before, 2 after)
    if (!(i < n)) // n is an integer number (10000000)
      break;
هذا ما يبدو وكأنه أثر في تدوين مثل جافا سكريبت. لكن جافا يحتاج الى مزيد من المعلومات من أجل تجميع التتبع. تتبع الحقيقية تبدو أكثر مثل هذا:

  trace_1_start:
    ++i;            // i is an integer number (0 before, 1 after)
    temp = a + i;   // a is an integer number (1 before, 2 after)
    if (lastOperationOverflowed())
      exit_trace(OVERFLOWED);
    a = temp;
    if (!(i < n))   // n is an integer number (10000000)
      exit_trace(BRANCHED);
    goto trace_1_start;
هذا التتبع يمثل حلقة، وينبغي أن تجمع على أنها حلقة، لذلك فإننا نعرب عن ذلك مباشرة باستخدام goto . أيضا، لا يمكن تجاوز عدد صحيح بالإضافة إلى ذلك، الأمر الذي يتطلب معالجة خاصة (على سبيل المثال، الإعادة مع العائمة بالإضافة إلى ذلك)، وهو ما يتطلب بدوره إنهاء التتبع. لذلك يجب أن تتبع وتشمل الاختيار تجاوز. وأخيرا، فإن مخارج التتبع بنفس الطريقة إذا كان الشرط حلقة غير صحيحة. رموز الخروج جافا اقول لماذا تم إنهاء التتبع، بحيث جافا يمكن ان يقرر ما يجب القيام به بعد ذلك (مثل ما إذا إلى إعادة إضافة أو الخروج من حلقة). لاحظ أن يتم تسجيل آثار في شكل داخلي خاص يتم أبدا عرضة لمبرمج - التدوين المستخدمة أعلاه هو فقط لأغراض تفسيرية.
بعد التسجيل، والتتبع على استعداد ليكون ترجمة لرمز الجهاز من نوع متخصص. يتم تنفيذ هذا التجميع بواسطة مترجم JIT الصغيرة (التي تحمل اسم، بما فيه الكفاية على النحو المناسب، nanojit) والنتائج التي يتم تخزينها في الذاكرة، وعلى استعداد ليتم تنفيذها من قبل وحدة المعالجة المركزية.
في المرة التالية التي يمر مترجم رأس حلقة، وسوف جافا بدء تنفيذ التتبع المترجمة. البرنامج الذي تشغله الآن سريعة جدا.
في التكرار 65537، سيتم إضافة عدد صحيح فيض. (2147450880 + 65537 = 2147516417، والذي هو أكبر من 2 ^ 31-1 = 2147483647، وهي أكبر وقعت 32 بت عدد صحيح.) عند هذه النقطة، إنهاء التتبع مع OVERFLOWED رمز. رؤية هذا، وسوف جافا عودة إلى الوضع مترجم وإعادة إضافة. لأن المترجم يفعل كل شيء بشكل عام، تتم معالجة الفائض وبالإضافة إلى ذلك كل شيء يعمل بشكل طبيعي. وسوف يبدأ جافا أيضا مراقبة هذه نقطة الخروج، وإذا تجاوز نقطة الخروج من أي وقت مضى يصبح حار، ومن المقرر بدء عملية تتبع جديد من تلك النقطة.
لكن في هذا البرنامج بصفة خاصة، ما يحدث بدلا من ذلك هو أن البرنامج يقوم بتمرير رأس حلقة ثانية. جافا يعرف لها أي أثر لهذه النقطة، ولكن جافا يعرف أيضا أنه لا يمكن استخدام هذا التتبع لما في ذلك التتبع وكان للقيم عدد صحيح، ولكن a هو الآن في شكل نقطة عائمة. هكذا جافا يسجل تتبع جديد:

  trace_2_start:
    ++i;            // i is an integer number
    a = a + i;      // a is a floating-point number
    if (!(i < n))   // n is an integer number (10000000)
      exit_trace(BRANCHED);
    goto trace_2_start;
جافا يجمع ثم تتبع جديد، وعلى التكرار حلقة المقبل، ويبدأ تنفيذ المشروع. بهذه الطريقة، جافا تحافظ على تشغيل جافا سكريبت ورمز الجهاز، حتى عندما أنواع تغيير. في النهاية سوف تتبع خروج مع رمز ومتفرعة. عند هذه النقطة، سوف جافا العودة إلى مترجم، والتي تأخذ أكثر من وانتهاء تشغيل البرنامج.
وهنا مرة تشغيل هذا البرنامج على جهاز الكمبيوتر المحمول (2.2GHz ماك بوك برو):
نظام تشغيل وقت (مللي ثانية)
SpiderMonkey (FF3) 990
جافا (FF3.5) 45
جافا (باستخدام INT) 25
جافا (استخدام مزدوج) 74
C (باستخدام INT) 5
C (استخدام مزدوج) 15
هذا البرنامج يحصل على تسريع ضخمة 22X من البحث عن المفقودين وتدير نحو بأسرع جاوة! المهام التي تقوم بعملية حسابية بسيطة داخل حلقات تحصل عادة speedups كبير من البحث عن المفقودين. كثير من هذه العملية بعض الشيء والمقاييس SunSpider الرياضيات، مثل bitops-3bit-bits-in-byte ، ctrypto-sha1 و math-spectral-norm الحصول على 6X-22X speedups.
الوظائف التي تستخدم عمليات أكثر تعقيدا، مثل التلاعب وجوه، والحصول على تسريع أصغر، عادة 2-5X. هذا يلي رياضيا من قانون أمدال، وحقيقة أن عمليات معقدة تستغرق وقتا أطول. إذا نظرنا إلى الوراء في الوقت المخطط، والنظر في عملية أكثر تعقيدا أن يأخذ 30T الوقت بالنسبة للجزء الأخضر. فإن أجزاء البرتقالي والبني لا يزال حوالي 30T معا، والقضاء عليهم حتى يعطي تسريع 2X. وكان المؤشر SunSpider string-fasta هو مثال لهذا النوع من البرنامج: يتم أخذ أكثر من مرة من قبل سلسلة العمليات التي لديها وقتا طويلا نسبيا لمربع أخضر.
هنا هو نسخة من برنامج مثالنا يمكنك محاولة في المتصفح:
العددية النتيجة: 49999995000000
تشغيل الوقت: 164 ms
متوسط ​​وقت التشغيل: 164 ms
فهم وتحديد مشكلات الأداء
هدفنا هو جعل جافا موثوق بها بالسرعة الكافية التي يمكنك كتابة التعليمات البرمجية في الطريقة التي تعبر عن أفضل الأفكار، دون القلق حول الأداء. إذا جافا لم يتم الإسراع في تنفيذ برنامج الخاص بك، ونأمل عليك الإبلاغ عن ذلك كما الشوائب حتى نتمكن من تحسين محرك. قال ذلك، بطبيعة الحال، قد تحتاج برنامج لتشغيل أسرع في FF3.5 اليوم. في هذا القسم، سنقوم شرح بعض الأدوات والتقنيات اللازمة لتحديد أداء البرنامج الذي لا يحصل على جيد (2X أو أكثر) تسريع مع JIT تمكين تتبع. (يمكنك تعطيل JIT من خلال الذهاب إلى حول: اعداد ووضع javascript.options.jit.content محافظة على false .)
الخطوة الأولى في فهم سبب المشكلة. السبب الأكثر شيوعا هو إحباط التتبع، وهو ما يعني ببساطة أن جافا لم يتمكن من الانتهاء من تسجيل أي أثر، وتخلى. النتيجة المعتادة هي أن الحلقة التي تحتوي على إحباط سيتم تشغيل في مترجم، حتى أنك لن تحصل على تسريع على أن حلقة. في بعض الأحيان، وتتبع مسار واحد خلال الحلقة، ولكن كان هناك إحباط في مسار آخر، والذي يؤدي جافا للتبديل جيئة وذهابا بين تفسير وتشغيل التعليمات البرمجية الأصلية. وهذا يمكن أن أترككم مع تسريع مخفضة، تسريع لا، أو حتى تباطؤ: طرق التحويل يتطلب وقتا، والتحول السريع لذلك يمكن أن يؤدي إلى سوء الأداء.
مع التصحيح بناء للمتصفح أو قذيفة JS (الذي أنا بناء نفسي - ونحن لا تنشر هذه البنيات) يمكن أن أقول لكم جافا لطباعة معلومات عن إحباط عن طريق تعيين TMFLAGS متغير البيئة. وعادة ما تفعل ذلك بهذه الطريقة:
 TMFLAGSTMFLAGS=minimal,abort
dist/MinefieldDebug.app/Contents/MacOS/firefox
و minimal الخيار بطباعة جميع النقاط حيث يبدأ تسجيل وتسجيل حيث ينتهي بنجاح. وهذا يعطي فكرة أساسية لما التتبع يحاول القيام به. و abort الخيار بطباعة جميع النقاط حيث تم إحباط تسجيل بسبب التركيبة غير معتمد. (إعداد TMFLAGS=help ستطبع لائحة أخرى TMFLAGS خيارات ومن ثم الخروج.)
(لاحظ أيضا أن TMFLAGS هو طريقة جديدة لطباعة معلومات التصحيح. إذا كنت تستخدم التصحيح بناء لإطلاق سراح FF3.5، الإعداد متغير البيئة هو TRACEMONKEY=abort .)
وهنا برنامج سبيل المثال أن لا تحصل على الكثير من تسريع في جافا.
 Monkey.
function runExample2() {
  var t0 = new Date;
 
  var sum = 0;
  for (var i = 0; i < 100000; ++i) {
    sum += i;
  }
 
  var prod = 1;
  for (var i = 1; i < 100000; ++i) {
    eval("prod *= i");
  }
  var dt = new Date - t0;
  document.getElementById(example2_time').innerHTML = dt + ' ms';
}


تشغيل الوقت: 138 ms
إذا وضعناها TMFLAGS=minimal,abort ، وسوف نحصل على هذا:

Recording starting from ab.js:5@23
recording completed at  ab.js:5@23 via closeLoop
 
Recording starting from ab.js:5@23
recording completed at  ab.js:5@23 via closeLoop
 
Recording starting from ab.js:10@63
Abort recording of tree ab.js:10@63 at ab.js:11@70: eval.
 
Recording starting from ab.js:10@63
Abort recording of tree ab.js:10@63 at ab.js:11@70: eval.
 
Recording starting from ab.js:10@63
Abort recording of tree ab.js:10@63 at ab.js:11@70: eval.
أول اثنين من أزواج من خطوط تدل على أن الحلقة الأولى، بدءا من السطر 5، تتبعت غرامة. وأظهرت السطور التالية أن جافا التي تتبع حلقة في خط 10، لكنه فشل في كل مرة بسبب وجود eval .
ملاحظة مهمة حول هذا إخراج التصحيح هو أنك لن ترى عادة بعض الرسائل تشير إلى أشجار الداخلية المتزايدة، وتحقيق الاستقرار، وهلم جرا. هذه هي الحقيقة ليست مشاكل: فهي عادة تشير إلى مجرد التأخير في الانتهاء من البحث عن المفقودين حلقة بسبب الطريقة صلات جافا الداخلي والخارجي الحلقات. في واقع الأمر، إذا نظرت إلى مزيد من الانخفاض في الانتاج بعد إحباط هذه، سوف ترى عادة أن الحلقات تفعل في نهاية المطاف أثر.
خلاف ذلك، فإن السبب الرئيسي لإحباط من قبل بنيات جافا سكريبت التي لا يتم دعمها حتى الآن من البحث عن المفقودين. عملية التسجيل تتبع أسهل لتنفيذ لعملية الأساسية مثل + مما هو عليه بالنسبة ميزة متقدمة مثل arguments . لم يكن لدينا الوقت للقيام قوية وآمنة البحث عن المفقودين من كل ميزة جافا سكريبت مشاركة في الوقت المناسب لإطلاق FF3.5، وحتى بعض من هم أكثر تقدما، مثل arguments ، لا يعود في FF3.5.0. غيرها من الميزات المتقدمة التي لا تتبع تشمل حاصل على واضعي، مع وحدة التقييم. هناك دعم جزئي للاغلاق، اعتمادا على كيفية بالضبط يتم استخدامها. ويمكن إعادة الهيكلية لتجنب هذه التركيبات تساعد على الأداء.
اثنين من المهم بصفة خاصة الميزات جافا سكريبت التي لا تتبع ما يلي:
  • العودية. جافا لا يرى التكرار الذي يحدث من خلال العودية مثل حلقة، لذلك لا تحاول أن تتبع ذلك. إعادة الهيكلية لاستخدام واضح for أو while الحلقات سوف تعطي أداء أفضل بشكل عام.
  • الحصول على أو تعيين خاصية DOM. (استدعاءات الأسلوب DOM على ما يرام.) تجنب هذه التركيبات عموما مستحيلا، ولكن إعادة بيع ديون رمز للانتقال الملكية DOM الوصول للخروج من الحلقات الساخنة وشرائح أداء الحرجة من شأنه أن يساعد.
ونحن نعمل بنشاط في البحث عن المفقودين كافة الميزات المذكورة أعلاه. على سبيل المثال، تقديم الدعم لتتبع arguments متاحة بالفعل في يبني كل ليلة.
هنا هو البرنامج المثال بطيئة بتعميل لتجنب eval . بالطبع، كان يمكن أن فعلت ببساطة المضمنة الضرب. بدلا من ذلك، وأنا استخدم وظيفة أنشأتها eval لأن هذا هو وسيلة أكثر عمومية من إعادة بيع ديون 1 eval . نلاحظ أن eval لا يزال من الممكن تتبع، لكنه يعمل فقط مرة واحدة حتى لا يهم.

function runExample3() {
  var t0 = new Date;
 
  var sum = 0;
  for (var i = 0; i < 100000; ++i) {
    sum += i;
  }
 
  var prod = 1;
  var mul = eval("(function(i) { return prod * i; })");
 
  for (var i = 1; i < 100000; ++i) {
    prod = mul(i);
  }
  var dt = new Date - t0;
  document.getElementById('example3_time').innerHTML = dt + ' ms';
}


تشغيل الوقت:
وهناك حالات قليلة أكثر الباطنية التي يمكن ان تؤذي أيضا أداء البحث عن المفقودين. واحد منهم هو الانفجار التتبع، والذي يحدث عندما حلقة لديه العديد من المسارات من خلال ذلك. النظر في حلقة مع 10 if البيانات في صف واحد: في حلقة لديه 1024 المسارات، مما يمكن أن يسبب ليتم تسجيلها 1024 آثار. التي من شأنها أن تستهلك الكثير من الذاكرة، لذلك جافا القبعات كل حلقة في 32 آثار. إذا كانت الحلقة لديها أقل من 32 التعقب الساخن، وسوف تؤدي بشكل جيد. ولكن إذا كان كل مسار يحدث مع تردد على قدم المساواة، ثم يتم تتبع 3٪ فقط من المسارات، والأداء سيعاني.
ويتم تحليل أفضل هذا النوع من المشاكل مع TraceVis ، مما يخلق تصورات من أداء جافا. حاليا، وبناء نظام يعتمد فقط TraceVis مواتية ليبني قذيفة، ولكن النظام الأساسي ويمكن أيضا تشغيل في المتصفح، وهناك عمل مستمر لتمكين TraceVis في شكل مناسب في المتصفح.
في بلوق وظيفة في TraceVis حاليا التفسير الأكثر تفصيلا لماذا المخططات يعني وكيفية استخدامها لتشخيص مشاكل الأداء. وآخر يحتوي أيضا على تحليل مفصل للمخطط أن يساعد في فهم الكيفية التي يعمل جافا بشكل عام.
المقارنة JITerature
هنا سوف أعطي بعض المقارنات مع غيرها من التصاميم JIT جافا سكريبت. سوف أركز أكثر على تصاميم افتراضية من محركات المتنافسة، لأنني لا أعرف تفاصيل عنها - لقد قرأت معلومات الإصدار وكشطها بت قليل من التعليمات البرمجية. آخر التحذير الكبير هو أن أداء في العالم الحقيقي يعتمد على الأقل إلى حد كبير على تفاصيل هندسة كما هو الحال في العمارة محرك.
يمكن للمرء أن يكون خيار تصميم. استدعاء أسلوب لكل غير متخصص JIT بواسطة هذا يعني مترجم JIT أن يجمع أسلوب في وقت واحد ويولد رمز عام، تماما مثل ما يفعل المترجم. وبالتالي، يتم قطع مربعات البني من مخططات للخروج. هذا النوع من JIT ليست في حاجة إلى بعض الوقت لتسجيل وجمع الآثار، ولكنه أيضا لا اكتب متخصصون، وبالتالي فإن صناديق البرتقال لا تزال قائمة. يمكن أن يزال هذا المحرك يتم سريعة جدا من خلال تصميم دقيق وتحقيق الاستفادة المثلى من شفرة مربع برتقالي. ولكن لا يمكن المربع البرتقالي يمكن القضاء عليها تماما في هذا التصميم، وبالتالي فإن الحد الأقصى من الأداء على البرامج الرقمية لن تكون جيدة كما محرك من نوع متخصص.
بقدر ما أستطيع أن أقول، حتى كتابة هذه السطور نيترو و V8 على حد سواء خفيفة غير متخصصة JITs. (قيل لي إن V8 لا تحاول تخمين أنواع قليلة من خلال النظر في شفرة المصدر (مثل التخمين ان a هو عدد صحيح في a >> 2 ) من أجل أن تفعل شيئا من نوع التخصص.) ويبدو أن جافا هو أسرع بشكل عام على المعايير الرقمية، وتوقع على النحو الوارد أعلاه. لكن جافا يعاني قليلا بشأن المعايير التي تستخدم أكثر من الكائنات، وذلك لأن العمليات كائن لدينا وإدارة الذاكرة لم أمثل بشدة كما.
لمزيد من تطوير JIT الأساسي هو نوع متخصص لكل طريقة JIT. هذا النوع من JIT يحاول نوع التخصص وسيلة تعتمد على أنواع وسيطة يتم استدعاء الأسلوب مع. مثل جافا، وهذا يتطلب بعض مراقبة التشغيل: التصميم الأساسي بالتحقق من أنواع الجدل في كل مرة يتم استدعاء أسلوب، وإذا لم تكن تلك الأنواع له مثيل من قبل، وتجمع نسخة جديدة من هذه الطريقة. أيضا مثل جافا، وهذا يمكن تصميم تتخصص بالديون رمز وإزالة كل المربعات البني والبرتقالي.
انا لست على علم بأن أي شخص قد نشرت لكل طريقة من نوع متخصص JIT لجافا سكريبت، ولكن لن أفاجأ اذا كان الناس يعملون على ذلك.
العيب الرئيسي لJIT نوع متخصصة لكل طريقة مقارنة JIT تتبع الأساسية هي أن لكل طريقة JIT فقط يلاحظ بشكل مباشر على أنواع المدخلات إلى أسلوب. يجب أن نحاول أن نستنتج أنواع للمتغيرات داخل أسلوب حسابيا، وهو أمر صعب للجافا سكريبت، وخاصة إذا كان أسلوب يقرأ خصائص الكائن. وبالتالي، فإنني أتوقع أن نوع متخصصة لكل طريقة JIT سوف تضطر إلى استخدام العمليات النوعية لبعض أجزاء من هذه الطريقة. والميزة الرئيسية لتصميم لكل الأسلوب هو أن الأسلوب يحتاج إلى تجميع مرة واحدة بالضبط لكل مجموعة من أنواع المدخلات، حتى انها ليست عرضة لاقتفاء أثر الانفجار. في المقابل، أعتقد أن أسلوب لكل JIT سوف تميل إلى أن تكون أسرع على الطرق التي لديها العديد من المسارات، والبحث عن المفقودين JIT سوف تميل إلى أن تكون أسرع على الطرق نوع specializable للغاية، خاصة إذا كان أسلوب يقرأ أيضا الكثير من القيم من خصائص .
 
 
 

 
 
 

إرسال تعليق

أحدث أقدم