はじめに
こんにちは。kubell の tomoikey と申します。そろそろ新卒入社から3年が経ちます。
今回 Go の GraphQL ライブラリとして広く使われている gqlgen (GitHub Star 10.6k) にパフォーマンス改善の PR を送り、無事マージされました🎉
https://github.com/99designs/gqlgen/pull/3874
この記事ではどのような問題を発見してどうやって解決したのかを解説します。
発見した問題
gqlgen には GraphQL クエリで要求されたフィールドを収集する CollectFields という関数があります。
これは「どのフィールドが要求されているか」を計算するために使われる関数です。
問題は配列型のフィールドを JSON にマーシャリングする際に配列の各要素に対して CollectFields が毎回呼び出されていたことです。
query {
users {
field1
field2
}
}
このようなクエリの場合、同じ SelectionSet (field1, field2, ...) に対して CollectFields が 10,000回 呼び出されていました。でも結果は毎回同じです。これは明らかに無駄な計算ですよね。
続きを読む