قم بتسريع ذاكرة التخزين المؤقت للمشروع في NoVerify (linter for PHP) 10 مرات

ليلة واحدة، في حين مناقشة الصعوبات التي تواجه تطوير اللنت لPHP في الذهاب مع اسكندر quasilyte ، ذكر اسكندر أن اختبارات يستغرق وقتا طويلا عند تشغيل محليا (حوالي دقيقة واحدة، ويبدو لي أن لإذهب أنها طويلة جدا). بدأنا الحفر ، وسرعان ما أصبح واضحًا أن الاختبارات التي تُجري NoVerify (اسم اللنتر) في الوضع مع تشغيل كاشف السباق "تتباطأ" بشكل أساسي . يتم فهرسة مستودع phpstorm-stubs لكل عملية إطلاق، والذي يحتوي على جميع تعريفات الوظائف / الفئات / الثوابت المضمنة الموجودة في PHP ، وتستغرق فهرسة هذا المستودع حوالي 4 ثوانٍ على جهاز رباعي النواة (لاحظ أنه بدون كاشف السباق يكون كل شيء أسرع بكثير). نظرًا لوجود العديد من هذه العمليات ، واحدة لكل مشروع مفتوح المصدر تم اختباره ، يمكن أن يستغرق إجمالي وقت التنفيذ لجميع الاختبارات دقائق. تصنف NoVerify نفسها كنقطة مرور سريعة جدًا لـ PHP ، لذلك ، بالطبع ، هذا الأداء محزن قليلاً وكان من الضروري إيجاد نوع من الحل.

NoVerify العمارة

كبداية ، لا يزال الأمر يستحق الحديث قليلاً عن كيفية عمل NoVerify. ينقسم عمل لينتر إلى مرحلتين واسعتين: الفهرسة والتحليل المباشر.

تعني فهرسة المشروع أن تعريفات وأنواع جميع الوظائف والفئات والطرق والثوابت والمتغيرات العامة يتم استخلاصها من جميع ملفات PHP ، ويتم تخزين كل هذه المعلومات في ذاكرة الوصول العشوائي للوصول السريع. أيضًا ، يتم حفظ هذه المعلومات في ذاكرة التخزين المؤقت على القرص بتنسيق gob لتجنب الحاجة إلى تحليل المشروع بأكمله في كل مرة. من المهم أنه حتى لتحليل ملف واحد ، يجب فهرسة المشروع بأكمله.، لأنه إذا كان هناك تحميل تلقائي للفئات في PHP ، فلن يكون هناك شيء من هذا القبيل للوظائف والثوابت وحتى المتغيرات العامة ، ويمكن تعريفها في أي مكان. بالطبع ، في مشاريع PHP الحديثة ، عادةً ما يتم استخدام الفصول فقط ولا تظهر مثل هذه المشكلات ، ولكن بالنسبة للمشاريع ذات التاريخ الطويل ، لا يزال هذا مناسبًا. كانت الحاجة إلى فهرسة المشروع بأكمله لتحليله هي السبب في كتابة NoVerify in Go ، لأن هذه اللغة تدعم تعدد مؤشرات الترابط بشكل جيد ، مما يعني أنها ستكون قادرة على فهرسة المشروع بشكل أسرع مما هو ممكن في PHP.

يمكن إجراء التحليل للملفات المحددة (على سبيل المثال ، تلك التي تغيرت في الالتزام الحالي) ، وللمشروع بأكمله مرة واحدة. في الحالة الأولى ، يستغرق التحليل وقتًا أقل من بناء الفهرس ، وأحيانًا بشكل ملحوظ (كما في المثال أعلاه مع الاختبارات ، حيث تستغرق فهرسة phpstorm-stubs 90 +٪ من الوقت). يستخدم التحليل معلومات حول أنواع جميع الوظائف / الفئات / الطرق المعلنة ، والتي تم جمعها في مرحلة الفهرسة.

تسريع فهرسة phpstorm-stubs

, , , , phpstorm-stubs, , , «» (.. ) // PHP, 25% , , . , : phpstorm-stubs «» , , , , , , .., , .

«» :

  1. , . , phpstorm-stubs .

  2. phpstorm-stubs , , .

  3. , gob.

  4. , phpstorm-stubs , Go- phpstorm-stubs . , , , 2-3 .

, (2), . , (1), , , . , , Go phpstorm-stubs ~200 (.. 20 ), , 18 , , .

?

, golden- , , , - . , , phpstorm-stubs. , -.

, ( Laravel, composer create-project --prefer-dist laravel/laravel blog, 1.6 PHP) 450 ( 4 ), NoVerify , , , , language server.

/

Go- 1.6 20-60 , , , , . .

: noverifyturbo 20 100 , ~80 1.6 PHP-.

, - NoVerify, , NoVerify. , .

-

: , Go- fmt.Printf("%#v", value).

مثال على رمز تم إنشاؤه

, , , , GoStringer(), .

PHP- Go-, map[string]func()*PerFileCache, ( PHP- , , ), , PHP-. , , , , map ( - , ), , , , map , .

+ , , - stat() , .

Laravel 1.6 , composer create-project --prefer-dist laravel/laravel blog , :

  1. , 1 : 4

  2. -, 1 : 400

  3. , 12 : 1 (10 )

  4. -, 12 : 240 (800 )

, - , , - map , , . , - , , .

— , , , , ( Google, ).

NoVerify Go, , phpstorm-stubs «» . . , , NoVerify workflow , PHPStorm VS Code , .

  1. NoVerify — PHP .

  2. phpstorm-stubs — «» PHP .

  3. NoVerify

  4. phpstorm-stubs

  5. مقارنة بين تنسيقات تسلسل البيانات المختلفة في Go




All Articles