
سيرجي كوكنكو هو مهندس أداء شهد جافا بعد الإصدار 1.0. خلال هذا الوقت ، تمكن من المشاركة في تطوير تطبيقات الأجهزة المحمولة والعميل والخوادم والأجهزة الافتراضية. منذ عام 2005 ، تشارك Java في الأداء وتعمل حاليًا في Oracle لتحسين أداء JDK. أحد أكثر المتحدثين شعبية في Joker و JPoint.
هذا habrapost هو مقابلة رائعة مع سيرجي ، مكرسة للمواضيع التالية:
- عبادة الأداء
- متى وما الذي يجب تحسينه ، التصميم الأولي للغة والمكتبة ؛
- مجالات واعدة لمزيد من التحسين ؛
- كيفية المشاركة في التطوير وما يمكن كسره بالتحسينات ؛
- الحيل المترجم ، تسجيل التنسيب.
- هل من الممكن تجميع قطة من اللحم المفروم؟
- عندما تعمل الاختبارات لمدة خمسة أيام متتالية وغيرها من الروتين المنزلي ؛
- كيف تصبح مهندس أداء ؛
- إعداد تقرير للجوكر المقبل.
عن عبادة الإنتاجية
أوليغ: أنت متحدثنا القديم ، وهذه ليست أول مقابلة لنا. أخبرني قليلاً ، من أنت الآن ، ماذا تفعل؟
سيرجي: أنا مثلما فعلت منذ سنوات عديدة ، وأنا أفعل نفس الشيء. أعمل في فريق Java Performance وأنا مسؤول عن أداء أجهزة Oracle Java ، OpenJDK.
أوليغ: ثم لدي سؤال قزم إلى حد ما: هنا أنت مهندس أداء ، وتقاريرك تدور حول جميع أنواع الأداء. لا تظن أن مشكلة الأداء مبالغ فيها إلى حد ما؟ الجميع يندفع معها ، لكن هل هذا ضروري؟
سيرجي: هذا سؤال جيد. كل هذا يتوقف على الآخر. يمكن اعتبار هذا النوع من انتباه الجمهور مفرطًا. إنتاجية العمل ، من ناحية أخرى ، هي المال.
هذا هو المال الحقيقي الذي ينفقه الناس على الأجهزة ، على نوع من السحب في أمازون. إذا لم تقم بمعالجة طلباتك بسرعة كافية - هذا كل شيء ، ستخسر العملاء ، تخسر المال ، تخسر كل شيء آخر. لذلك ، طلب الأداء ، بالطبع ، موجود دائمًا. والسؤال هو مدى أهمية ذلك في كل حالة. أنا صامت حول التداول عالي التردد.
أوليغ: بالمناسبة ، هل تعتقد أن جافا مناسبة لهذا؟
سيرجي: هل لديك الفرصة للقاء شخص مثل بيتر لوري ؟
أوليغ: من هو الرئيس التنفيذي لشركة كرونيكل سوفتوير ، مطوري OpenHFT؟
سيرجي: هذا صديق مشهور جدًا من لندن يسافر كثيرًا في المؤتمرات. إنهم يعملون في Java في التداول عالي التردد ، ويعيشون بشكل رائع.
أوليغ: هل يفعلون ذلك على جافا أم أنها تسمى الكود الأصلي من جافا؟ لا يزال هناك فرق.
سيرجي: لا أعرف في هذا المستوى ، لم يخبره بذلك. من حيث المبدأ ، إذا رغبت في ذلك ، يمكن تحقيق كل ما هو مطلوب في Java نفسها.
أوليغ: مثيرة للاهتمام. إذا كنت تأخذ ، على سبيل المثال ، مجتمعًا من الثعابين ، فإن لديهم عبادة إنتاجية أقل بكثير. كيف يتم هذا بالضبط ما يحدث في مجتمعنا؟ ربما كنت أثارت عبادة الأداء مع تقاريرك؟ أنت ، Shipilev ، Pangin ، إيفانوف وهلم جرا.
سيرجي: لا أعرف كيف حدث ذلك. إن عبادة الإنتاجية في المؤتمر الروسي أعلى بكثير منها في المؤتمر الأمريكي. ربما هذا يعكس الجمهور نفسه. فينا يريد الناس أن يكونوا أكثر انخراطًا في الإنتاجية ، إنه أمر مثير للاهتمام لهم. وفي أمريكا ، يريدون أن يفعلوا أكثر مقابل ما يدفعونه أكثر. ولكن هذه هي الفرضية ، التخمين. لقد حدث ذلك.
متى وما يحتاج إلى تحسين
أوليغ: قلت إنه لا يزال هناك طلب للأداء. في أي نقطة تحتاج إلى البدء في التفكير في الأداء؟ متى يضرب الرعد؟
سيرجي: هذا هو السؤال التجريدي العام. من الأفضل أن تتحول مرة أخرى إلى الكلمة الرئيسية لـ Alexey Shipilev من أحد المؤتمرات السابقة ، حيث رسم كل هذا بشكل جيد بما فيه الكفاية.
أوليغ: نعم ، أتذكر "منحنى اسم Sh".
سيرجي: أنت بحاجة إلى القيام بالأداء على الفور ، ولكن حسب المستوى. ليس من الضروري أن تكتب المعايير على الفور. من المعروف ، على سبيل المثال ، أن التقييد العادي لمستوى بنية واجهة برمجة التطبيقات بين Set كمجموعة و SortedSet يفرض بالفعل قيودًا حسابية أساسية علينا.
إذا دفعنا إلى مجموعة SortedSet في واجهة برمجة التطبيقات (على الرغم من أن لا أحد يحتاج إلى ذلك فرزها) ، ثم امتد في جميع أنحاء نظامنا ، فسيتم سحب هذا الشيء بشكل مؤلم وصعب.
يبدأ السؤال من مستوى التصميم - فهذه مسألة تتعلق بالحد الأدنى من القيود. يجب استخدام أصغر قيود ممكنة حتى تتمكن من اللعب معها لاحقًا. على سبيل المثال ، عندما كنت ألوي قطعًا مختلفة من Java ، ظهرت كلمات سيئة للغاية. أرغب في القيام بشيء باستخدام أحد الفئات الأساسية ، لكن لا يمكنني فعل أي شيء ، لأن واجهة برمجة التطبيقات (API) ثابتة ، لا يمكنك تغييرها بعد الآن ، فقد تم الزحف إليها بالفعل. ولكن من أجل القيام ببعض الحيل ورفع تردد التشغيل ، تحتاج إلى إخفاء بعض التفاصيل.
دراسة حالة: اعتدت على القرفصاء حول الصف java.math.BigDecimal. كان هناك طلب كبير من جهات مختلفة لتفريقه بطريقة أو بأخرى. هناك حالة خاصة جيدة بما فيه الكفاية عندما يكون BigDecimal الخاص بنا ليس "كبير" ، إنه مجرد رقم عشري ، وتحتاج إلى قراءتها.
الآن ، بالطبع ، تم صنع غلاف مناسب لهذا الغرض. ولكن إذا لم يكن هناك مُنشئ عام يخرج عن BigDecimal ، ولكن بعض الأساليب والمصانع الثابتة ، يمكن للمرء أن يجعل BigDecimal مجردة ، ويبثث تطبيقين مختلفين يعملان حسب الحاجة. لكن هذا مستحيل ، لأن المنشئ ينفد. لهذا السبب ، عليك بالفعل إجراء فحص غير ضروري لوقت التشغيل بالداخل ، مما يسمح لك باتباع مسار سريع في بعض الحالات.
أوليغ: هل يستنتج من ذلك أنه عند تطوير مكتبة قياسية يستحق التخلي عن المصممين والقيام بالبنائين في كل مكان؟
سيرجي: إنه متأخّر.
أوليغ: إذا لم يفت الأوان ، فهل ستكون فكرة جيدة؟
سيرجي: وقالت إنها تعطي مساحة أكبر للمناورة. انظر: نحن نكتب جديدة ، وهذا الجديد يقف خارج المنشئ. يتم الحصول على عمليتين: أولاً نقوم بإنشاء كائن ، ثم ندعو المنشئ الذي يملأه. وأحيانًا يكون من المفيد جدًا إخفاء إنشاء الكائن وإنشاء كائن خاطئ موجود لدينا في الخارج. هذا هو تقييد اللغة ، الأصلي ، من الأيام الأولى لجافا.
أوليغ: حسنًا ، يستخدم الجميع الآن أطر عمل DI تسمح لك بتحريف الوكلاء كما تريد وإضافة أي شيء ، متجاوزة هذا القيد. في التصميم الأصلي للغة ، هل يمكنك إضافة شيء مثل هذا ، حاوية حقن التبعية المضمنة؟
سيرجي: لدي رأي محدد للغاية حول التصميم الأولي للغة. إذا كنت تتذكر تاريخ Java 1.0 ، فقد ظهر ضغط وقت خطير للغاية ، فكل شيء يجب أن يتم بسرعة.
هناك الآلاف من الأشياء التي أود شخصيا رؤيتها ثابتة من الإصدار الأول. لكنني أخشى أنه حتى لو تم اختيار واحد من بين هذه الألف ، واحد أو ثلاثة ، وكان من الممكن أن يتم تصنيعها في وقت جافا الأول ، فلن تكون جافا قد خرجت. هذا مثال قياسي على أن الأفضل هو عدو الخير.
ماذا يمكن أن يكون الأمثل في جافا
أوليغ: يمكن للأشخاص العاديين إصلاح شيء ما في مشروعهم فقط ، وأنت ، كمهندسين أداء في JDK ، تؤثر على الفور على مئات الآلاف من المشاريع. السؤال الذي يطرح نفسه: على مدى أكثر من 20 عامًا من تطوير Java ، هل كانت هناك أي مناطق في JDK يمكن أن يؤدي فيها تدخل المهندسين الأساسيين إلى حدوث تأثير ملحوظ؟ وما مدى ملاحظة هذا "التأثير الملحوظ"؟
سيرجي: أولاً ، الآن لا تعمل Java على الإطلاق على الأجهزة ، على سبيل المثال ، منذ 10 سنوات. الحديد الآن والحديد قبل 10 سنوات هما اختلافات كبيرة ، وينصح بإجراء تحسينات مختلفة.
ثانياً ، إنه أمر رائع ، بالطبع ، عندما يجلس مهندس أداء ويسرع شيئًا ما ، ويحصل على أعداد هائلة ، ويقدم تقارير لرؤسائه ، ويحصل على أموال مقابل الحصول على مكافأة بعد رفع تردد التشغيل. ولكن هناك قدر كبير من العمل جار في مشاريع جديدة. تتم إضافة ميزة ، ومهمة مهندس الأداء ليست رفع تردد التشغيل ، ولكن التأكد من أن كل شيء على ما يرام في هذه الميزة. أو إن لم يكن موافقًا ، فابحث عن نوع من التصحيح.
أوليغ: كيف يمكنك أن تكون متأكداً؟ لم تقم بالتحقق من الكود بشكل رسمي. ما هو "تأكد"؟
سيرجي: للتأكد من أن كل شيء على ما يرام من وجهة نظر الأداء هو رأي خبير شخصي من مهندس أداء سيكتب تقريراً ويقول إن "كل شيء طبيعي في هذه الميزة". اعتمادًا على حجم الميزة ، ينطوي هذا في بعض الأحيان على قدر كبير من العمل ، وأحيانًا كثير من الجهود المختلفة. بدءاً من حقيقة أنك تحتاج فقط إلى الجلوس بغباء ، شاهد ما يجري هناك ، وقياس هذا المجال ، وقياس المعايير ، ومعرفة ما يحدث عند الخروج ، واتخاذ قرار مستنير معقول.
أوليغ: ومن وجهة نظر الأداء والميزات الجديدة - هل تتحرك Java عمومًا للأمام؟ هل هناك شيء هناك؟ لأن أجهزتنا لم تتغير كثيرًا ، على سبيل المثال ، إذا تحدثنا عن Intel.
سيرجي: لأي فترة لم يتغير هذا؟
أوليغ: على سبيل المثال ، آخر 10 سنوات.
سيرجي: نعم ، هل هناك AVX-512 على الأجهزة قبل عقد من الزمان؟
أوليغ: رقم هو ، على الأرجح ، غير موجود دائمًا في العصر الحديث؟
سيرجي: بالتأكيد لا. لدينا في مختبرنا ، ولكن كل شيء يشغلها مترجمون. هم الشد حتى الآن ، لذلك أنا لم تنظر.
أوليغ: هل يمكن اعتبار دعم AVX-512 مثالاً على ميزة نموذجية؟
سيرجي: ممكن على الأرجح. ماذا أفعل بالضبط: كان لدينا طبقة كبيرة من العمل على حقيقة أن هناك متطلبات حديثة لإضافة خوارزميات تشفير جديدة. هذا شيء لا يمكن الاعتماد عليه ببساطة خوارزميات تشفير عمرها عشر سنوات. نحن بحاجة إلى خوارزميات جديدة ، مفاتيح أكبر. وإضافة خوارزميات تشفير جديدة يحدث ، أود أن أقول ، باستمرار.
أوليغ: هل تسريع الأجهزة بطريقة أو بأخرى؟
سيرجي: كل هذا يتوقف على خوارزميات محددة. هناك خوارزميات تسارع بشكل جيد للغاية. بالمناسبة ، قبل 10 سنوات ، لم يكن هذا الأمر يعمل على أجهزة Intel ، ولكن حوالي 5-6 مدى ظهور الإرشادات الجيدة ، حتى وحدات AES ذات التسارع. تم تنفيذ كل هذا مع فاصل زمني الحد الأدنى.
أوليغ: ماذا عن وحدة معالجة الرسومات ، هل يمكنهم أيضًا مضاعفة المصفوفات؟
سيرجي: حول GPU - محادثة منفصلة. لدينا لهذا مشروع بنما يتم فيه تنفيذ كل هذه الأعمال ، وسيصل في يوم من الأيام إلى خط جافا الرئيسي مع كل الأشياء الجيدة.
أوليغ: لديّ بعض معارفه الذين يشاركون ، بشروط ، في الرياضيات المالية. من مرحلة ما ، ينتقلون دائمًا إلى C ++ للحوسبة ويدعون أنه من غير المريح استخدام كل هذه التحسينات والأجهزة من النظام الأساسي المدار. هل يمكن تحسين هذا؟
سيرجي: لدينا أيضًا طلب كبير لهذا وهناك عدد من المتطلبات الداخلية. على سبيل المثال ، لجعل شيء ما يعمل بشكل أفضل في مجال التعلم الآلي. كقاعدة عامة ، هذا هو الضرب مصفوفة عادي ، والتي يمكن التخلص منها على GPU. العمل على هذا مستمر ، دعنا نقول ذلك.
لدينا مشروعان كبيران للمظلات: Valhalla و Panama ، والتي يجب أن تجمع ميزات مثل GPU. عند تقاطع Valhalla و Panama يوجد API vector الذي يعمل مع تعليمات SIMD / SSE / AVX الخاصة بنا مباشرةً من كود Java ، وفاللهالا نفسه مع الأنواع المضمّنة كلها خطوات كبيرة في هذا الاتجاه.
ما يمكن كسره عن طريق التحسين ، وكيفية المشاركة في التنمية
أوليغ: المظلات التي ذكرتها متشابهة مع بعضها البعض. هل من الممكن أن يؤثر أحد المشروعات على مشروع آخر ، بما في ذلك من حيث الكود وملف تعريف الأداء؟ على سبيل المثال ، هل عاودت الرد على شيء ما ، وقام رون بريسلر المؤسف ، وهو يسكب الدموع ، بإصلاح اختباراته في زاوية في المساء؟
سيرجي: هذا يحدث في كل وقت. مثال ملموس هو API المتجه. لكي يعمل Vector API جيدًا ، يجب أن تصبح متجهاتنا الأصلية أنواع قيم ، أو كما يطلق عليها الآن في Java ، أنواع مضمنة. يمكنك إجراء حل بديل في نقطة اتصال فعالة وتطبيقه بطريقة ما ، لكنني أريد أن أحصل على حل عام. من ناحية أخرى ، فإن الميزة الرئيسية للأنواع المضمّنة هي على وجه التحديد عدم القلق بشأن تخطيط هذه البيانات ، وتخطيط هذه البيانات مهم للغاية لواجهة برمجة تطبيقات Vector.
لأنه ، في الواقع ، يتوافق مباشرة مع AVX-512 وكل ذلك. من الواضح أنك تحتاج إلى القيام ببعض القرفصاء ، وبعض التحسينات ، والتي من ناحية ، ستجعل النوع المضمّن من النوع العادي ، ولكن سيكون له تخطيط قائم على الأجهزة. وبطبيعة الحال ، تحدث التقاطعات. إذا نظرت إلى مجموعات الأشخاص الذين ينتقلون إلى بنما وينتقلون إلى فالهالا ، فإنهم يتقاطعون أكثر من النصف.
أوليغ: تنظيمية بحتة ، هنا لديك مشروع ، نوع من مشكلة في الأداء ، لكنه في مفترق عدة مشاريع. ماذا تفعل بعد ذلك؟ كيفية حل هذا؟ اتضح أن هذا هو بالفعل مفاضلة بين المشاريع والناس ، وليس بين بعض المهام المجردة.
سيرجي: كل شيء بسيط للغاية هنا: إذا كانت هذه مشكلة في الأداء مع ميزة تم تصميمها للتو ، فستحتاج إلى الانتقال إلى الأشخاص الذين يقومون بالتصميم والقول ، "إذن ، وماذا سنفعل؟ دعونا نفعل ذلك بطريقة مختلفة. " تبدأ المناقشة ، ويتم حل المشكلة.
إذا كان الرمز موجود بالفعل ، فهو يعمل بالفعل. في الحالة المثالية ، تقوم بإصلاح هذه المشكلة ، أو إذا لم تتمكن من حلها بشكل كامل ، فانتقلت إلى النموذج الأولي ، ثم أتيت مرة أخرى إلى مالك الرمز وتقول: "هنا هو النموذج الأولي ، ماذا سنفعل؟" علاوة على ذلك ، نحل هذه المشكلة خصيصًا لكل حالة.
أوليغ: لدينا أشخاص مهتمون هنا لا يمكنهم المشاركة في هذه العملية ، وهم مستخدمون نهائيون.
سيرجي: لا يمكنهم المشاركة بشكل كافٍ حتى لا يتم دفع رواتبهم في Oracle. إذا كنت لا تحتاج إلى راتب ، تعال إلى OpenJDK واشترك.
أوليغ: كم هو حقيقي؟ OpenJDK لديه بعض العباقرة لعنة مثلك ، وأين الناس العاديون ، وأين أنت. لنفترض شيئًا ما يتباطأ بالنسبة لي ، فماذا أفعل وكيف؟
سيرجي: إذا كنت لا تعرف المشكلة ، فهذا سؤال منفصل ، ما إذا كان شخص ما سيبحث عن حل لك ، فهذا سؤال كمجال وكمثال وما إلى ذلك. حتى لو كنت لا تعرف المشكلة ، فمن المنطقي ، ربما ، الكتابة في OpenJDK والسؤال. إذا كان هذا شيئًا ما نقر عليه أحدهم على الفور ، فسوف ينتزعه الناس. إذا لم تكن تهم أي أحد ، فستعلق دون إجابة.
أوليغ: افترض أنني أعرف المشكلة وأعلم ما الذي يجب إصلاحه.
سيرجي: إذا كنت تعرف المشكلة ، فأنت تأتي إلى OpenJDK ، وتوقع كل القطع اللازمة من الورق ، وتقدم تصحيحًا ، وتتم مراجعتها وسكبها.
أوليغ: هل هذا بسيط؟
سيرجي: حسنًا ، نعم ، القليل من البيروقراطية ، انتظر قليلاً. التقطت أمس Tagir ( lany ) إصلاح صغير واحد تخلت عنه. إنه يريد فقط أن يتم جلبه إلى النهاية. بدأ تقديمها إلى الذهن من تلقاء نفسه. يقول: "لعنة ، ما الأمر ، لقد فعلت كل شيء ، وضعت ، لا أحد يراجع." حسنا نعم ، لا أحد يراجع. إنه يوليو ، نصف مكتب Java في إجازة. سوف يخرجون من العطلات ويقومون بذلك.
أوليغ: العطلات في الولايات المتحدة الأمريكية هي تقريبا نفس التواريخ كما هو الحال عادة في روسيا؟
سيرجي: لا ، نظام العطلات في الولايات المتحدة مختلف تمامًا عن نظام روسيا. أولاً ، أنها أصغر بكثير. وأيضًا ، في الولايات المتحدة الأمريكية ، يرتبط نظام الإجازات بالمدارس. عندما يكون لديك أطفال في إجازة - ثم إجازات. بمجرد أن تبدأ الأعياد ، تبدأ كل أمريكا في التحرك. وبما أن الفصول الدراسية هنا تنتهي في منتصف يونيو وتبدأ في منتصف أغسطس ، فإن هذه الدلتا لقضاء الإجازة ليست كبيرة جدًا - شهرين فقط.
الحيل المترجم ، تسجيل التنسيب
أوليغ: هل حدث أن قمت بتحسين شيء ما في المنزل ، وبعد ذلك اضطر المستخدمون إلى كتابة الكود بطريقة مختلفة؟ بمعنى آخر ، إذا كانت عملية اختيار سلسلة فرعية تستخدم في تحديد نطاق معين ، وتقوم الآن بعمل نسخة كاملة ، فإن هذا إعادة المعالجة يؤدي إلى تغيير الطريقة التي تكتب بها الكود.
سيرجي: بالتأكيد كان الأمر كذلك ، لكنني لن أعطي أمثلة محددة الآن. السؤال هو ، ما الذي يضعه الناس عند كتابة الكود؟ إذا احتاجوا إلى الضغط على أقصى أداء ، ولهذا يقومون بجميع أنواع الحيل الخاصة ببرنامج التحويل البرمجي ، فيجب أن يكونوا على استعداد للمطور البرمجي للتطور مع مرور الوقت ، وعليهم تعديل التعليمات البرمجية الخاصة بهم باستمرار وفقًا للحالة الحالية للمترجم. وهذا رائع.
لنفترض ، فجأة ، بعد 20 عامًا ، أن Graal سيصبح المترجم الرئيسي لـ HotSpot - عندها سيتعين على هؤلاء الفقراء إعادة كتابة كل شيء على الإطلاق. يحدث هذا فقط إذا كنت تتحمل مثل هذا الواجب الفني - لتتبع التغييرات في المحول البرمجي. من الأسهل بكثير كتابة التعليمات البرمجية الصحيحة دون روابط مباشرة ، مع تطبيقات عامة أكثر أو أقل طبيعية.
بالمناسبة ، عن المترجمين - ليس فقط عن المترجمين جافا ، ولكن بشكل عام. يوجد قانون مور ، وهو ليس قانونًا ، لكنه مجرد ملاحظة تجريبية بأن عدد الترانزستورات يتضاعف كل عام ونصف.
وهناك بالضبط نفس القانون (قانون Proebsting's ) الذي يزيد فيه أداء الكود بدون تعديل بنسبة 4 بالمائة كل سنة ونصف إلى سنتين. هذا 4 بالمائة هو ما يحصل عليه المستخدمون مجانًا مجانًا من تطور المجمعين. لا الأجهزة ، وهي المجمعين.
أوليغ: أتساءل من أين تأتي هذه النسب. هل هذا نوع من عدم الكفاءة الأولية؟ ولكن في يوم من الأيام سينتهي هذا المخزون من أوجه القصور.
سيرجي: لا ، إنها مجرد مسألة تطوير تكنولوجي. قمت بإنهاء برنامج التحويل البرمجي عندما بدأت العمل على الأداء. ولكن بمجرد أن انخرطت ، كان أكبر اكتشاف بالنسبة لي في عام 2005 أو 2006. اكتشفت ذلك على الإطلاق في عام 2008 لأنني لم أقرأ المقال في الوقت المناسب.
من المهم جدًا في أي إنشاء رمز تخصيص التسجيل. من المعروف أنه بشكل عام ، هذه المشكلة كاملة NP. من الصعب للغاية حلها ، وبالتالي تحاول جميع المجمعين دفع نوع من الخوارزمية التقريبية بدرجات متفاوتة من الجودة.
وهنا يأتي مقال حيث يثبت الرجال أنه في بعض الحالات التي تغطي عددًا كبيرًا من المجمعين وعددًا كبيرًا من العروض الداخلية مع قيود معينة ، توجد خوارزمية متعددة الحدود دقيقة لمهمة تخصيص تخصيص السجل. الصيحة ، دعنا نذهب!
حدث هذا في عام 2005 ، لم يقم المترجمون السابقون بإدراك ذلك.
أوليغ: الآن يمكنك إنشاء مخصص جديد لجافا؟
سيرجي: الآن بعد أن كان هناك حل نظري ، يمكن إعادة كتابته. لم أخض في التفاصيل ، لكنني أعرف أن اللاعبين من Excelsior قاموا بتنفيذ الخوارزمية.
أوليغ: لقد أجرينا مؤخرًا مقابلة مع كليف كليك ، وتحدث عن مُخصص عبقرية بجنون معقد ومجنون كتبه لجافا. لا تريد أن تكتب واحدة أخرى؟
سيرجي: رقم
أوليغ: هل هناك أي شيء طبيعي؟
سيرجي: لا ، إنه غير طبيعي. من وجهة نظري النفعية ، سأقول إنني أنظر إلى المجمّع وأحيانًا أرى: "حسنًا ، نعم ، لقد أصبحت السجلات سيئة". إذا لجأت إلى ركل المترجمين لدينا ، وقمنا بإعادة كتابة المخصص ، فما الذي سنحصل عليه؟ سنحصل على بعض المكاسب ، لكن من غير المحتمل أن أراها إلا في الأمثلة التي رأيت فيها التخصيص غير الفعال للسجلات. طالما لا توجد إخفاقات كبيرة في هذا المجال ، هناك دائمًا ما يجب فعله والحصول على المزيد من المكاسب.
Oleg: هل هناك أي مجالات عمل في JDK حيث كل مترجم مقصورة المحرك أو سحر الأداء يكسر على السطح؟ أنت تقول إنك تحتاج إلى كتابة الكود العادي العادي وكل شيء سيكون على ما يرام ، لكن هذا يبدو مشبوهًا.
سيرجي: كل شيء سيكون على ما يرام حتى تحتاج إلى المخادع السوبر. إذا كنت في حاجة إليها بسرعة ، فاستعد دائمًا لإعادة كتابتها. في الوقت الحالي ، إذا كنت تأخذ طلبًا كبيرًا مجردة ، إلى حد كبير ، كما هو مكتوب - بشكل عام لا يلعب دورًا من حيث الأداء.
من ناحية ، بمجرد أن يتم تشغيل أداة تجميع مجمعي البيانات المهملة ، فإنها تستهلك نسبة 10-20٪ ، من ناحية أخرى ، تبدأ بنية التطبيق في الظهور. المشكلة الكبيرة التي رأيتها في كومة التطبيقات هي أنها تحول البيانات. أخذنا البيانات من هنا ، نقلناها إلى هناك ، قمنا ببعض التحولات هناك. بشكل عام ، أي برنامج يفعل ذلك بالضبط. ينقل البيانات من مكان إلى آخر بطريقة ما. ولكن إذا كان لديك الكثير من التحولات في البرنامج ، فلن يساعد المترجم.
أوليغ: يمكنك محاولة تتبع بعض الأشياء البسيطة ، مثل: هذه القطعة من الذاكرة تغير الملاك وتتنقل بين الكائنات في هذا الاتجاه.
سيرجي: لا ، هذه مشكلة في التصميم. لكنني لا أتحول فحسب ، بل أتحول مع التعديلات ، بل أفعل شيئًا معهم. يمكن الحصول على أكبر فائدة في التطبيقات الحقيقية الضخمة إذا فكرت في الأمر: هل هناك الكثير من التحول المطلوب. بدلا من عشرة ، مما يجعل سبعة هو بالفعل جيدة.
(قد يبدو أن الفيديو نفسه قد تم تكراره عن طريق الخطأ هنا. في الواقع ، كل شيء أبسط ، قام هبر بتخزين الصورة الخطأ من YouTube)
نقوم بجمع قطة من اللحم المفروم
أوليغ: لقد عقدنا مؤخرًا مؤتمر هيدرا حول الحوسبة الموزعة. والكثير من الناس يضايقون كثيرا بأشياء مثل نموذج التكلفة ، وتحديد تكلفة كل عملية - دقيقة جدا ودقيقة للغاية. يريد الأشخاص حقًا كتابة جميع التعليمات ، ويضيفون تكلفة كل منها ويرون عدد الأشرطة التي ستحتاج إليها الشفرة. أتساءل كيف يعمل هذا النهج في الواقع الحديث. , ?
: , . , . , . , . , , , . ?
: : « ».
: , . , . , ? . — , . , , - , .
: , ?
: , ? , . ?
: , - ?
: , — , . - . ? , , , , . , .
: .
: , 1 . , , . , - , - .
: OpenJDK . ? C++ . — -?
: , , . . OpenJDK 15 . 15 .
: , , . .
: ! , , . , , , , , . , . : , , ( , ), — . , , .
: , ?
: , , Java.
: ?
: , , Valhalla.
: - , , — , ? ? .
: , . — . , , , . , , . . 2-3 , , , , — , .
, , inline-, Java Joker. . , Java- , runtime-. red flag: runtime- 0. ? , out of order- — .
, . , . ? . . baseline, , 5-6 , — . , , - 2 — - . 3% - , . 3% ?
: , ?
: , . performance-, . , , — .
, , . performance- — , - performance- - , . , , .
, , , , performance- — class libraries hotspot, .
: , - performance-, . , , ?
: . ? , performance- performance-.
, : , , Oracle, Twitter, Netflix , - . , — . , performance- , .
- , , performance- , ? , , .
, performance- — . : - performance review, , , , , . — performance .
: « , ...», , — . , - — , , , .
Joker
: Joker . ?
: inline-, .
: , value-?
: , , . . , . value Java- . value, value, by value, - by value, value type. , .
. , , , Rémi Forax - , inline-. , , Kotlin inline- , value- Java, .
. value-, , , mvt (minimum value types), LW 1. LW 2 — , . , , , . , , , , performance- , , , , .
: , - -?
: , - . , , , , invokedynamic .
: , , , , .
: , , , . — , , . , ?
: , , , .
: . , , inline- generic- , inline-. , .
: , - ?
: : inline- LW2 . value-, generic, .
« Java -? Valhalla» Joker , - 25-26 2019 . , .