NoVerify(PHPのリンター)のプロジェクトキャッシュを10倍高速化

ある晩、Iskander @quasilyteとGoPHP用のリンターを開発することの難しさについて話し合っているときに、Iskanderは、テストをローカルで実行すると長い時間がかかると述べました(約1分、Goの場合はかなり長いようです)。掘り始めたところ、レース検出器をオンにしたモードでNoVerify(リンターの名前)を実行するテストは、主に「減速」していることがすぐに明らかになりましたphpstorm-stubsリポジトリは、起動ごとにインデックスが付けられます、PHPにある組み込み関数/クラス/定数のすべての定義が含まれており、このリポジトリのインデックス作成には4コアマシンで約4秒かかります(レース検出器がないとすべてがはるかに高速になることに注意してください)。テスト対象のオープンソースプロジェクトごとに1つずつ、そのような実行がいくつかあるため、すべてのテストの合計実行時間は数分かかる場合があります。NoVerifyは、PHPの非常に高速なリンターとして位置付けられているため、もちろん、このパフォーマンスは少し悲しいものであり、何らかの解決策を見つける必要がありました。

NoVerifyアーキテクチャ

まず、NoVerifyがどのように機能するかについて少し話す価値があります。リンター作業は、インデックス作成と直接分析の2つの大きなフェーズに分けられます。

プロジェクトのインデックス作成とは、すべての関数、クラス、メソッド、定数、およびグローバル変数の定義とタイプがすべてのPHPファイルから抽出され、これらの情報がすべてRAMに保存されてすばやくアクセスできることを意味します。また、この情報は、プロジェクト全体を毎回解析する必要がないように、gob形式でディスクのキャッシュに保存されます。 単一のファイルを分析する場合でも、プロジェクト全体にインデックスを付ける必要があることが重要です。なぜなら、PHPのクラスに自動ロードがある場合、関数、定数、さらにはグローバル変数にはそのようなものはなく、どこでも定義できるからです。もちろん、最近のPHPプロジェクトでは、通常はクラスのみが使用され、そのような問題は発生しませんが、長い歴史を持つプロジェクトの場合、これは依然として関連性があります。 GoでNoVerifyを作成する理由は、分析のためにプロジェクト全体にインデックスを付ける必要があったためです。この言語はマルチスレッドを適切にサポートしているため、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