Percepat cache proyek di NoVerify (linter untuk PHP) 10 kali

Suatu malam, saat mendiskusikan kesulitan mengembangkan linter untuk PHP di Go dengan Iskander @quasilyte , Iskander menyebutkan bahwa pengujian membutuhkan waktu lama jika dijalankan secara lokal (sekitar satu menit, dan menurut saya untuk Go cukup lama). Kami mulai menggali, dan dengan cepat menjadi jelas bahwa pengujian yang menjalankan NoVerify (nama linter) dalam mode dengan detektor balapan dihidupkan pada umumnya "melambat" . Repositori phpstorm-stubs diindeks untuk setiap peluncuran, yang berisi semua definisi fungsi / kelas / konstanta bawaan yang ada di PHP, dan pengindeksan repositori ini membutuhkan waktu sekitar 4 detik pada mesin 4-inti (perhatikan bahwa tanpa detektor balapan semuanya jauh lebih cepat). Karena ada beberapa proses seperti itu, satu untuk setiap proyek sumber terbuka yang diuji, total waktu eksekusi semua pengujian dapat memakan waktu beberapa menit. NoVerify memposisikan dirinya sebagai linter yang sangat cepat untuk PHP, jadi, tentu saja, kinerja ini agak menyedihkan dan perlu dicari solusi.

Arsitektur NoVerify

Sebagai permulaan, masih ada gunanya membicarakan sedikit tentang cara kerja NoVerify. Pekerjaan Linter dibagi menjadi dua fase besar: pengindeksan dan analisis langsung.

Pengindeksan proyek berarti bahwa definisi dan jenis semua fungsi, kelas, metode, konstanta, dan variabel global diekstrak dari semua file PHP, dan semua informasi ini disimpan dalam RAM untuk akses cepat. Informasi ini juga disimpan dalam cache pada disk dalam format gob untuk menghindari kebutuhan mengurai keseluruhan proyek setiap saat. Penting bahwa bahkan untuk menganalisis satu file, seluruh proyek harus diindeks., karena jika ada autoload untuk kelas di PHP, maka tidak ada yang namanya fungsi, konstanta, dan bahkan variabel global, dan mereka dapat didefinisikan di mana saja. Tentu saja, dalam proyek PHP modern, biasanya hanya kelas yang digunakan dan masalah seperti itu tidak muncul, tetapi untuk proyek dengan sejarah yang panjang ini masih relevan. Kebutuhan untuk mengindeks seluruh proyek untuk analisisnya itulah alasan penulisan NoVerify di Go, karena bahasa ini mendukung multithreading dengan baik, yang berarti akan dapat mengindeks proyek jauh lebih cepat daripada yang mungkin dilakukan di 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).

contoh kode yang dihasilkan

, , , , 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. Membandingkan format serialisasi data yang berbeda di Go




All Articles