コンテンツにスキップ

ベンチマーク

モデルケース:同じテストスイート、2 つの実行モデル

Section titled “モデルケース:同じテストスイート、2 つの実行モデル”

bench/modelcase は小さいけれどごく普通の Go プロジェクトです。ショップのデータ層 (database/sql、トリガーとビューを含む 5 本の SQL マイグレーション、 マスタデータとしてカテゴリ 20 件、商品 500 件、ユーザー 1,000 件)と、 それに対する 70 本のテストからなります。テストはケース表で書いてあり、 参照だけのシナリオ 5 つ(ユーザーごとの注文一覧、注文詳細、売れ筋商品、 商品検索、カテゴリ別売上)が各 10 ケースで 50 本、テーブルを更新する シナリオ 5 つ(注文の作成・キャンセル・出荷、ユーザーと注文の削除、 値引きの適用)が各 4 ケースで 20 本あり、更新後の行を検証します。どのテストも同じ 40 件のサンプル注文から始まります。 テスト関数は両モデルで同一で、背後のフィクスチャだけが違います。

  • pgmem:TestMain がテストプロセス内でサーバーを起動し、スキーマと マスタデータを投入してスナップショットを 1 回取ります。参照テストに コピーは要りません。スナップショットの後にサンプルデータを 1 回だけ 投入したテンプレートサーバーをそのまま共用します。更新テストは それぞれスナップショットから自分のフォークを作り、サンプルデータを 投入します。70 本すべてが t.Parallel() を呼ぶので、スナップショット 以降は -parallel の枠いっぱいで一斉に走ります。
  • 共有サーバー 1 台:testcontainers-go の PostgreSQL モジュールで起動した 公式イメージをオンメモリで動かしたもの(PGDATA は tmpfs、fsync、 synchronous_commit、full_page_writes はオフ、新しいテストプロセスが 起動する Ryuk も含む)、devbox のネイティブ PostgreSQL 18、公式イメージの docker run の 3 種類です。ドライバがサーバーを起動し、テストバイナリが共有データベースに スキーマとマスタデータを投入します。参照テストは共有 データベース上で並列に走れますが、更新テストはそうはいきません。 トランザクション系テーブルを TRUNCATE し、在庫と価格を戻し、サンプル データを投入してから走り、次の更新テストは順番を待ちます。1 台のサーバー で結果を決定的に保つには、こうするしかありません。

同じ 70 本のテスト(参照 50、更新 20)を、同じスキーマ・マイグレーション・シードデータで、go test の並列度 8 で実行しました。各タイムラインは Apple M3(8 コア)で 5 回走らせたうち合計時間が中央値だった実行です。バーは各実行モデルのノードで、左に短くまとまっているほど速いことを表します。

スイート全体の実時間

  • pgmem204 ms
    5 回の範囲 196 ms〜219 ms
  • Testcontainers 共有サーバー 1 台1.73 s
    5 回の範囲 1.70 s〜1.81 s
  • PostgreSQL 共有サーバー 1 台646 ms
    5 回の範囲 633 ms〜671 ms
  • docker run 共有サーバー 1 台2.48 s
    5 回の範囲 2.26 s〜3.59 s

テストは go test -parallel の 8 枠に描いています。1 つの枠には、そこで順に走ったテストが並びます。 タイムラインはすべて同じ時間軸です。

  • DB 起動
  • スキーマ投入 + マスタデータ投入
  • スナップショット
  • フォーク(更新テスト専用のコピー)
  • サンプルデータ投入
  • データのリセット
  • 参照テスト
  • 更新テスト
pgmem 204 ms 合計テストプロセス内。参照テストはテンプレートを共用し、更新テストはスナップショットからフォークして、すべて並列に走るフォークは 20 本で、更新テスト(20 本)1 本につき 1 本です。参照テスト 50 本はフォークせず、テンプレートのデータベースをそのまま使います。
pgmem: 代表実行のタイムライン, 204 ms0500100015002000合計 204 msTestMainTestMain · DB 起動: 39 ms (0.0 → 39 ms)TestMain · スキーマ投入 + マスタデータ投入: 47 ms (39 → 86 ms)TestMain · スナップショット: 3.2 ms (86 → 89 ms)共有データベース(参照テスト)共有データベース(参照テスト) · サンプルデータ投入: 13 ms (122 → 135 ms)並列枠 1CreateOrder/two_lines · フォーク(更新テスト専用のコピー): 13 ms (89 → 102 ms)CreateOrder/two_lines · サンプルデータ投入: 18 ms (103 → 121 ms)CreateOrder/two_lines · 更新テスト: 1.2 ms (121 → 122 ms)TopProducts/top_1 · 参照テスト: 0.5 ms (135 → 135 ms)TopProducts/top_30 · 参照テスト: 0.6 ms (135 → 136 ms)TopProducts/top_8 · 参照テスト: 1.1 ms (136 → 137 ms)TopProducts/top_2 · 参照テスト: 1.0 ms (137 → 138 ms)ApplyDiscount/games_0 · フォーク(更新テスト専用のコピー): 10 ms (138 → 148 ms)ApplyDiscount/games_0 · サンプルデータ投入: 13 ms (148 → 161 ms)ApplyDiscount/games_0 · 更新テスト: 0.4 ms (161 → 161 ms)ListOrders/user_71 · 参照テスト: 0.1 ms (161 → 161 ms)ListOrders/user_64 · 参照テスト: 0.1 ms (161 → 161 ms)ListOrders/user_57 · 参照テスト: 0.5 ms (161 → 162 ms)ListOrders/user_22 · 参照テスト: 0.8 ms (162 → 163 ms)ListOrders/user_29 · 参照テスト: 0.5 ms (163 → 163 ms)SearchProducts/product_1 · 参照テスト: 1.0 ms (163 → 164 ms)SearchProducts/product_8 · 参照テスト: 0.8 ms (164 → 165 ms)並列枠 2CreateOrder/five_lines · フォーク(更新テスト専用のコピー): 14 ms (89 → 103 ms)CreateOrder/five_lines · サンプルデータ投入: 12 ms (103 → 116 ms)CreateOrder/five_lines · 更新テスト: 0.9 ms (116 → 116 ms)ShipOrder/one_paid · フォーク(更新テスト専用のコピー): 8.8 ms (117 → 126 ms)ShipOrder/one_paid · サンプルデータ投入: 18 ms (126 → 144 ms)ShipOrder/one_paid · 更新テスト: 0.4 ms (144 → 144 ms)GetOrder/orders_6_16_26_36 · 参照テスト: 3.5 ms (145 → 148 ms)RevenueByCategory/Garden · 参照テスト: 0.8 ms (148 → 149 ms)RevenueByCategory/Toys · 参照テスト: 0.3 ms (149 → 150 ms)RevenueByCategory/Games · 参照テスト: 0.3 ms (150 → 150 ms)RevenueByCategory/Music · 参照テスト: 0.4 ms (150 → 150 ms)GetOrder/orders_10_20_30_40 · 参照テスト: 2.0 ms (150 → 152 ms)SearchProducts/product_0 · 参照テスト: 0.8 ms (152 → 153 ms)DeleteUser/user_36 · フォーク(更新テスト専用のコピー): 11 ms (153 → 164 ms)DeleteUser/user_36 · サンプルデータ投入: 9.6 ms (164 → 173 ms)DeleteUser/user_36 · 更新テスト: 0.3 ms (173 → 174 ms)並列枠 3CreateOrder/out_of_stock · フォーク(更新テスト専用のコピー): 13 ms (89 → 102 ms)CreateOrder/out_of_stock · サンプルデータ投入: 20 ms (102 → 122 ms)CreateOrder/out_of_stock · 更新テスト: 0.2 ms (122 → 122 ms)TopProducts/top_10 · 参照テスト: 1.5 ms (135 → 136 ms)TopProducts/top_20 · 参照テスト: 1.4 ms (136 → 138 ms)ApplyDiscount/movies_50 · フォーク(更新テスト専用のコピー): 9.3 ms (138 → 147 ms)ApplyDiscount/movies_50 · サンプルデータ投入: 13 ms (147 → 160 ms)ApplyDiscount/movies_50 · 更新テスト: 0.6 ms (160 → 161 ms)ListOrders/user_43 · 参照テスト: 0.2 ms (161 → 161 ms)SearchProducts/product_4 · 参照テスト: 0.3 ms (161 → 162 ms)ListOrders/user_36 · 参照テスト: 0.4 ms (162 → 162 ms)ListOrders/user_15 · 参照テスト: 0.7 ms (162 → 163 ms)SearchProducts/product_2 · 参照テスト: 0.9 ms (163 → 164 ms)SearchProducts/product_6 · 参照テスト: 0.6 ms (164 → 164 ms)SearchProducts/product_5 · 参照テスト: 0.7 ms (164 → 165 ms)並列枠 4CreateOrder/one_line · フォーク(更新テスト専用のコピー): 16 ms (89 → 106 ms)CreateOrder/one_line · サンプルデータ投入: 14 ms (106 → 119 ms)CreateOrder/one_line · 更新テスト: 0.5 ms (119 → 120 ms)ShipOrder/twice · フォーク(更新テスト専用のコピー): 10 ms (120 → 130 ms)ShipOrder/twice · サンプルデータ投入: 10 ms (130 → 141 ms)ShipOrder/twice · 更新テスト: 3.5 ms (141 → 144 ms)GetOrder/orders_5_15_25_35 · 参照テスト: 3.1 ms (145 → 148 ms)GetOrder/orders_2_12_22_32 · 参照テスト: 2.3 ms (148 → 151 ms)RevenueByCategory/Outdoors · 参照テスト: 0.6 ms (151 → 151 ms)RevenueByCategory/Sports · 参照テスト: 0.5 ms (151 → 152 ms)GetOrder/orders_8_18_28_38 · 参照テスト: 1.8 ms (152 → 154 ms)DeleteUser/user_22 · フォーク(更新テスト専用のコピー): 8.6 ms (154 → 162 ms)DeleteUser/user_22 · サンプルデータ投入: 9.8 ms (162 → 172 ms)DeleteUser/user_22 · 更新テスト: 0.3 ms (172 → 172 ms)並列枠 5CancelOrder/paid · フォーク(更新テスト専用のコピー): 12 ms (89 → 102 ms)CancelOrder/paid · サンプルデータ投入: 17 ms (102 → 119 ms)CancelOrder/paid · 更新テスト: 0.7 ms (119 → 119 ms)ShipOrder/pending_rejected · フォーク(更新テスト専用のコピー): 8.3 ms (121 → 129 ms)ShipOrder/pending_rejected · サンプルデータ投入: 18 ms (129 → 146 ms)ShipOrder/pending_rejected · 更新テスト: 0.2 ms (146 → 147 ms)GetOrder/orders_4_14_24_34 · 参照テスト: 2.3 ms (147 → 150 ms)RevenueByCategory/Movies · 参照テスト: 0.4 ms (150 → 150 ms)GetOrder/orders_9_19_29_39 · 参照テスト: 2.1 ms (150 → 152 ms)DeleteUser/user_15 · フォーク(更新テスト専用のコピー): 5.8 ms (152 → 158 ms)DeleteUser/user_15 · サンプルデータ投入: 14 ms (158 → 172 ms)DeleteUser/user_15 · 更新テスト: 0.3 ms (172 → 172 ms)並列枠 6CancelOrder/another_paid · フォーク(更新テスト専用のコピー): 15 ms (89 → 105 ms)CancelOrder/another_paid · サンプルデータ投入: 12 ms (105 → 116 ms)CancelOrder/another_paid · 更新テスト: 2.8 ms (116 → 119 ms)TopProducts/top_50 · 参照テスト: 1.7 ms (135 → 136 ms)TopProducts/top_15 · 参照テスト: 2.1 ms (136 → 139 ms)ApplyDiscount/music_25 · フォーク(更新テスト専用のコピー): 11 ms (139 → 149 ms)ApplyDiscount/music_25 · サンプルデータ投入: 9.7 ms (149 → 159 ms)ApplyDiscount/music_25 · 更新テスト: 0.5 ms (159 → 160 ms)ListOrders/user_50 · 参照テスト: 1.4 ms (162 → 163 ms)SearchProducts/product_3 · 参照テスト: 1.8 ms (163 → 165 ms)SearchProducts/product_9 · 参照テスト: 0.3 ms (165 → 165 ms)並列枠 7CancelOrder/shipped · フォーク(更新テスト専用のコピー): 14 ms (90 → 104 ms)CancelOrder/shipped · サンプルデータ投入: 11 ms (104 → 115 ms)CancelOrder/shipped · 更新テスト: 0.5 ms (115 → 116 ms)ShipOrder/all_paid · フォーク(更新テスト専用のコピー): 6.0 ms (118 → 124 ms)ShipOrder/all_paid · サンプルデータ投入: 12 ms (124 → 136 ms)ShipOrder/all_paid · 更新テスト: 0.9 ms (136 → 136 ms)TopProducts/top_3 · 参照テスト: 2.3 ms (137 → 139 ms)GetOrder/orders_1_11_21_31 · 参照テスト: 0.9 ms (139 → 140 ms)GetOrder/orders_7_17_27_37 · 参照テスト: 0.5 ms (140 → 141 ms)RevenueByCategory/Books · 参照テスト: 6.7 ms (141 → 147 ms)GetOrder/orders_3_13_23_33 · 参照テスト: 3.4 ms (147 → 151 ms)RevenueByCategory/Kitchen · 参照テスト: 0.9 ms (151 → 152 ms)RevenueByCategory/Tools · 参照テスト: 0.4 ms (152 → 152 ms)ListOrders/user_8 · 参照テスト: 0.5 ms (152 → 152 ms)SearchProducts/product_7 · 参照テスト: 0.8 ms (153 → 153 ms)DeleteUser/user_29 · フォーク(更新テスト専用のコピー): 10 ms (153 → 164 ms)DeleteUser/user_29 · サンプルデータ投入: 9.6 ms (164 → 173 ms)DeleteUser/user_29 · 更新テスト: 0.3 ms (173 → 174 ms)並列枠 8CancelOrder/pending · フォーク(更新テスト専用のコピー): 13 ms (90 → 103 ms)CancelOrder/pending · サンプルデータ投入: 16 ms (103 → 119 ms)CancelOrder/pending · 更新テスト: 0.7 ms (119 → 120 ms)TopProducts/top_5 · 参照テスト: 2.0 ms (135 → 137 ms)ApplyDiscount/books_10 · フォーク(更新テスト専用のコピー): 7.6 ms (137 → 145 ms)ApplyDiscount/books_10 · サンプルデータ投入: 19 ms (145 → 165 ms)ApplyDiscount/books_10 · 更新テスト: 0.4 ms (165 → 165 ms)スイート開始からのミリ秒
Testcontainers 共有サーバー 1 台 1.73 s 合計公式イメージを testcontainers-go の postgres モジュールでオンメモリ起動(tmpfs、fsync なし)。更新テストはリセットを挟んで順番に走るコピーはなく、参照テスト 50 本と更新テスト 20 本が 1 つのデータベースを共有します。
Testcontainers 共有サーバー 1 台: 代表実行のタイムライン, 1.73 s0500100015002000合計 1.73 sTestMainTestMain · DB 起動: 761 ms (0.0 → 761 ms)761TestMain · スキーマ投入 + マスタデータ投入: 108 ms (761 → 868 ms)108共有データベース(参照テスト)共有データベース(参照テスト) · データのリセット: 5.1 ms (1.62 s → 1.63 s ms)共有データベース(参照テスト) · サンプルデータ投入: 29 ms (1.63 s → 1.65 s ms)並列枠 1CreateOrder/two_lines · データのリセット: 9.2 ms (869 → 878 ms)CreateOrder/two_lines · サンプルデータ投入: 36 ms (878 → 913 ms)CreateOrder/two_lines · 更新テスト: 2.0 ms (913 → 915 ms)CreateOrder/one_line · データのリセット: 8.1 ms (915 → 923 ms)CreateOrder/one_line · サンプルデータ投入: 28 ms (923 → 951 ms)CreateOrder/one_line · 更新テスト: 0.9 ms (951 → 952 ms)CreateOrder/five_lines · データのリセット: 7.6 ms (952 → 960 ms)CreateOrder/five_lines · サンプルデータ投入: 27 ms (960 → 987 ms)CreateOrder/five_lines · 更新テスト: 1.9 ms (987 → 989 ms)CreateOrder/out_of_stock · データのリセット: 7.5 ms (989 → 996 ms)CreateOrder/out_of_stock · サンプルデータ投入: 27 ms (996 → 1.02 s ms)CreateOrder/out_of_stock · 更新テスト: 0.4 ms (1.02 s → 1.02 s ms)CancelOrder/paid · データのリセット: 7.0 ms (1.02 s → 1.03 s ms)CancelOrder/paid · サンプルデータ投入: 26 ms (1.03 s → 1.06 s ms)CancelOrder/paid · 更新テスト: 1.7 ms (1.06 s → 1.06 s ms)CancelOrder/pending · データのリセット: 6.8 ms (1.06 s → 1.07 s ms)CancelOrder/pending · サンプルデータ投入: 27 ms (1.07 s → 1.09 s ms)CancelOrder/pending · 更新テスト: 1.3 ms (1.09 s → 1.09 s ms)CancelOrder/another_paid · データのリセット: 6.8 ms (1.09 s → 1.1 s ms)CancelOrder/another_paid · サンプルデータ投入: 28 ms (1.1 s → 1.13 s ms)CancelOrder/another_paid · 更新テスト: 1.4 ms (1.13 s → 1.13 s ms)CancelOrder/shipped · データのリセット: 6.9 ms (1.13 s → 1.14 s ms)CancelOrder/shipped · サンプルデータ投入: 28 ms (1.14 s → 1.17 s ms)CancelOrder/shipped · 更新テスト: 0.4 ms (1.17 s → 1.17 s ms)ShipOrder/one_paid · データのリセット: 6.6 ms (1.17 s → 1.17 s ms)ShipOrder/one_paid · サンプルデータ投入: 28 ms (1.17 s → 1.2 s ms)ShipOrder/one_paid · 更新テスト: 0.5 ms (1.2 s → 1.2 s ms)ShipOrder/pending_rejected · データのリセット: 6.1 ms (1.2 s → 1.21 s ms)ShipOrder/pending_rejected · サンプルデータ投入: 30 ms (1.21 s → 1.24 s ms)ShipOrder/pending_rejected · 更新テスト: 0.2 ms (1.24 s → 1.24 s ms)ShipOrder/all_paid · データのリセット: 7.7 ms (1.24 s → 1.24 s ms)ShipOrder/all_paid · サンプルデータ投入: 40 ms (1.24 s → 1.28 s ms)ShipOrder/all_paid · 更新テスト: 4.2 ms (1.28 s → 1.29 s ms)ShipOrder/twice · データのリセット: 8.4 ms (1.29 s → 1.3 s ms)ShipOrder/twice · サンプルデータ投入: 37 ms (1.3 s → 1.33 s ms)ShipOrder/twice · 更新テスト: 0.5 ms (1.33 s → 1.34 s ms)DeleteUser/user_15 · データのリセット: 4.9 ms (1.34 s → 1.34 s ms)DeleteUser/user_15 · サンプルデータ投入: 32 ms (1.34 s → 1.37 s ms)DeleteUser/user_15 · 更新テスト: 0.8 ms (1.37 s → 1.37 s ms)DeleteUser/user_22 · データのリセット: 5.3 ms (1.37 s → 1.38 s ms)DeleteUser/user_22 · サンプルデータ投入: 30 ms (1.38 s → 1.41 s ms)DeleteUser/user_22 · 更新テスト: 0.6 ms (1.41 s → 1.41 s ms)DeleteUser/user_29 · データのリセット: 5.9 ms (1.41 s → 1.41 s ms)DeleteUser/user_29 · サンプルデータ投入: 29 ms (1.41 s → 1.44 s ms)DeleteUser/user_29 · 更新テスト: 0.6 ms (1.44 s → 1.44 s ms)DeleteUser/user_36 · データのリセット: 6.0 ms (1.44 s → 1.45 s ms)DeleteUser/user_36 · サンプルデータ投入: 28 ms (1.45 s → 1.48 s ms)DeleteUser/user_36 · 更新テスト: 0.6 ms (1.48 s → 1.48 s ms)ApplyDiscount/books_10 · データのリセット: 5.7 ms (1.48 s → 1.48 s ms)ApplyDiscount/books_10 · サンプルデータ投入: 27 ms (1.48 s → 1.51 s ms)ApplyDiscount/books_10 · 更新テスト: 1.0 ms (1.51 s → 1.51 s ms)ApplyDiscount/music_25 · データのリセット: 6.0 ms (1.51 s → 1.52 s ms)ApplyDiscount/music_25 · サンプルデータ投入: 30 ms (1.52 s → 1.55 s ms)ApplyDiscount/music_25 · 更新テスト: 0.6 ms (1.55 s → 1.55 s ms)ApplyDiscount/movies_50 · データのリセット: 5.3 ms (1.55 s → 1.55 s ms)ApplyDiscount/movies_50 · サンプルデータ投入: 29 ms (1.55 s → 1.58 s ms)ApplyDiscount/movies_50 · 更新テスト: 0.6 ms (1.58 s → 1.58 s ms)ApplyDiscount/games_0 · データのリセット: 7.1 ms (1.58 s → 1.59 s ms)ApplyDiscount/games_0 · サンプルデータ投入: 29 ms (1.59 s → 1.62 s ms)ApplyDiscount/games_0 · 更新テスト: 0.6 ms (1.62 s → 1.62 s ms)TopProducts/top_1 · 参照テスト: 1.0 ms (1.65 s → 1.66 s ms)TopProducts/top_3 · 参照テスト: 0.8 ms (1.66 s → 1.66 s ms)TopProducts/top_2 · 参照テスト: 1.6 ms (1.66 s → 1.66 s ms)RevenueByCategory/Books · 参照テスト: 3.5 ms (1.66 s → 1.66 s ms)RevenueByCategory/Outdoors · 参照テスト: 1.9 ms (1.66 s → 1.66 s ms)RevenueByCategory/Sports · 参照テスト: 0.5 ms (1.66 s → 1.66 s ms)RevenueByCategory/Tools · 参照テスト: 0.8 ms (1.66 s → 1.66 s ms)RevenueByCategory/Kitchen · 参照テスト: 0.6 ms (1.66 s → 1.67 s ms)RevenueByCategory/Garden · 参照テスト: 0.8 ms (1.67 s → 1.67 s ms)RevenueByCategory/Games · 参照テスト: 0.6 ms (1.67 s → 1.67 s ms)RevenueByCategory/Movies · 参照テスト: 0.4 ms (1.67 s → 1.67 s ms)ListOrders/user_8 · 参照テスト: 1.0 ms (1.67 s → 1.67 s ms)ListOrders/user_57 · 参照テスト: 0.6 ms (1.67 s → 1.67 s ms)ListOrders/user_43 · 参照テスト: 1.2 ms (1.67 s → 1.67 s ms)GetOrder/orders_7_17_27_37 · 参照テスト: 2.9 ms (1.67 s → 1.67 s ms)SearchProducts/product_7 · 参照テスト: 1.9 ms (1.67 s → 1.67 s ms)並列枠 2TopProducts/top_10 · 参照テスト: 14 ms (1.65 s → 1.67 s ms)ListOrders/user_50 · 参照テスト: 1.6 ms (1.67 s → 1.67 s ms)GetOrder/orders_5_15_25_35 · 参照テスト: 2.7 ms (1.67 s → 1.67 s ms)SearchProducts/product_6 · 参照テスト: 0.8 ms (1.67 s → 1.67 s ms)SearchProducts/product_2 · 参照テスト: 1.9 ms (1.67 s → 1.68 s ms)並列枠 3TopProducts/top_50 · 参照テスト: 13 ms (1.65 s → 1.67 s ms)ListOrders/user_71 · 参照テスト: 2.0 ms (1.67 s → 1.67 s ms)GetOrder/orders_9_19_29_39 · 参照テスト: 3.1 ms (1.67 s → 1.67 s ms)SearchProducts/product_8 · 参照テスト: 1.4 ms (1.67 s → 1.67 s ms)並列枠 4TopProducts/top_30 · 参照テスト: 12 ms (1.65 s → 1.67 s ms)RevenueByCategory/Music · 参照テスト: 2.1 ms (1.67 s → 1.67 s ms)ListOrders/user_36 · 参照テスト: 0.3 ms (1.67 s → 1.67 s ms)GetOrder/orders_1_11_21_31 · 参照テスト: 2.4 ms (1.67 s → 1.67 s ms)GetOrder/orders_3_13_23_33 · 参照テスト: 1.5 ms (1.67 s → 1.67 s ms)SearchProducts/product_5 · 参照テスト: 0.9 ms (1.67 s → 1.67 s ms)SearchProducts/product_1 · 参照テスト: 0.5 ms (1.67 s → 1.67 s ms)並列枠 5TopProducts/top_20 · 参照テスト: 14 ms (1.65 s → 1.67 s ms)ListOrders/user_22 · 参照テスト: 0.5 ms (1.67 s → 1.67 s ms)GetOrder/orders_10_20_30_40 · 参照テスト: 2.9 ms (1.67 s → 1.67 s ms)GetOrder/orders_2_12_22_32 · 参照テスト: 1.9 ms (1.67 s → 1.67 s ms)並列枠 6TopProducts/top_15 · 参照テスト: 11 ms (1.65 s → 1.67 s ms)RevenueByCategory/Toys · 参照テスト: 3.4 ms (1.67 s → 1.67 s ms)ListOrders/user_29 · 参照テスト: 1.1 ms (1.67 s → 1.67 s ms)GetOrder/orders_6_16_26_36 · 参照テスト: 3.5 ms (1.67 s → 1.67 s ms)SearchProducts/product_4 · 参照テスト: 1.1 ms (1.67 s → 1.67 s ms)並列枠 7TopProducts/top_8 · 参照テスト: 13 ms (1.66 s → 1.67 s ms)ListOrders/user_64 · 参照テスト: 1.2 ms (1.67 s → 1.67 s ms)ListOrders/user_15 · 参照テスト: 1.4 ms (1.67 s → 1.67 s ms)GetOrder/orders_4_14_24_34 · 参照テスト: 2.2 ms (1.67 s → 1.67 s ms)SearchProducts/product_0 · 参照テスト: 1.0 ms (1.67 s → 1.67 s ms)SearchProducts/product_3 · 参照テスト: 2.5 ms (1.67 s → 1.68 s ms)並列枠 8TopProducts/top_5 · 参照テスト: 15 ms (1.66 s → 1.67 s ms)GetOrder/orders_8_18_28_38 · 参照テスト: 2.9 ms (1.67 s → 1.67 s ms)SearchProducts/product_9 · 参照テスト: 1.5 ms (1.67 s → 1.67 s ms)スイート開始からのミリ秒
PostgreSQL 共有サーバー 1 台 646 ms 合計ネイティブの PostgreSQL(devbox)。書き込みテストはリセットを挟んで順番に走るコピーはなく、参照テスト 50 本と更新テスト 20 本が 1 つのデータベースを共有します。
PostgreSQL 共有サーバー 1 台: 代表実行のタイムライン, 646 ms0500100015002000合計 646 msTestMainTestMain · DB 起動: 192 ms (0.0 → 192 ms)192TestMain · スキーマ投入 + マスタデータ投入: 57 ms (192 → 249 ms)共有データベース(参照テスト)共有データベース(参照テスト) · データのリセット: 4.2 ms (588 → 592 ms)共有データベース(参照テスト) · サンプルデータ投入: 9.6 ms (592 → 602 ms)並列枠 1CreateOrder/two_lines · データのリセット: 6.7 ms (249 → 256 ms)CreateOrder/two_lines · サンプルデータ投入: 21 ms (256 → 277 ms)CreateOrder/two_lines · 更新テスト: 1.4 ms (277 → 278 ms)CreateOrder/one_line · データのリセット: 7.7 ms (278 → 286 ms)CreateOrder/one_line · サンプルデータ投入: 18 ms (286 → 304 ms)CreateOrder/one_line · 更新テスト: 0.8 ms (304 → 304 ms)CreateOrder/five_lines · データのリセット: 7.0 ms (304 → 311 ms)CreateOrder/five_lines · サンプルデータ投入: 12 ms (311 → 324 ms)CreateOrder/five_lines · 更新テスト: 0.9 ms (324 → 325 ms)CreateOrder/out_of_stock · データのリセット: 6.3 ms (325 → 331 ms)CreateOrder/out_of_stock · サンプルデータ投入: 12 ms (331 → 343 ms)CreateOrder/out_of_stock · 更新テスト: 0.2 ms (343 → 344 ms)CancelOrder/paid · データのリセット: 6.2 ms (344 → 350 ms)CancelOrder/paid · サンプルデータ投入: 11 ms (350 → 360 ms)CancelOrder/paid · 更新テスト: 0.8 ms (360 → 361 ms)CancelOrder/pending · データのリセット: 5.9 ms (361 → 367 ms)CancelOrder/pending · サンプルデータ投入: 10 ms (367 → 377 ms)CancelOrder/pending · 更新テスト: 0.6 ms (377 → 378 ms)CancelOrder/another_paid · データのリセット: 5.9 ms (378 → 384 ms)CancelOrder/another_paid · サンプルデータ投入: 9.9 ms (384 → 394 ms)CancelOrder/another_paid · 更新テスト: 0.6 ms (394 → 394 ms)CancelOrder/shipped · データのリセット: 6.2 ms (394 → 400 ms)CancelOrder/shipped · サンプルデータ投入: 10 ms (400 → 411 ms)CancelOrder/shipped · 更新テスト: 0.2 ms (411 → 411 ms)ShipOrder/one_paid · データのリセット: 5.4 ms (411 → 416 ms)ShipOrder/one_paid · サンプルデータ投入: 9.9 ms (416 → 426 ms)ShipOrder/one_paid · 更新テスト: 0.3 ms (426 → 426 ms)ShipOrder/pending_rejected · データのリセット: 5.9 ms (426 → 432 ms)ShipOrder/pending_rejected · サンプルデータ投入: 9.9 ms (432 → 442 ms)ShipOrder/pending_rejected · 更新テスト: 0.1 ms (442 → 442 ms)ShipOrder/all_paid · データのリセット: 5.8 ms (442 → 448 ms)ShipOrder/all_paid · サンプルデータ投入: 9.5 ms (448 → 458 ms)ShipOrder/all_paid · 更新テスト: 1.3 ms (458 → 459 ms)ShipOrder/twice · データのリセット: 4.9 ms (459 → 464 ms)ShipOrder/twice · サンプルデータ投入: 9.7 ms (464 → 474 ms)ShipOrder/twice · 更新テスト: 0.3 ms (474 → 474 ms)DeleteUser/user_15 · データのリセット: 4.4 ms (474 → 478 ms)DeleteUser/user_15 · サンプルデータ投入: 9.3 ms (478 → 488 ms)DeleteUser/user_15 · 更新テスト: 0.4 ms (488 → 488 ms)DeleteUser/user_22 · データのリセット: 3.9 ms (488 → 492 ms)DeleteUser/user_22 · サンプルデータ投入: 9.6 ms (492 → 502 ms)DeleteUser/user_22 · 更新テスト: 0.6 ms (502 → 502 ms)DeleteUser/user_29 · データのリセット: 4.9 ms (502 → 507 ms)DeleteUser/user_29 · サンプルデータ投入: 9.4 ms (507 → 516 ms)DeleteUser/user_29 · 更新テスト: 0.3 ms (516 → 517 ms)DeleteUser/user_36 · データのリセット: 4.1 ms (517 → 521 ms)DeleteUser/user_36 · サンプルデータ投入: 9.4 ms (521 → 530 ms)DeleteUser/user_36 · 更新テスト: 0.3 ms (530 → 531 ms)ApplyDiscount/books_10 · データのリセット: 3.9 ms (531 → 534 ms)ApplyDiscount/books_10 · サンプルデータ投入: 9.9 ms (534 → 544 ms)ApplyDiscount/books_10 · 更新テスト: 0.4 ms (544 → 545 ms)ApplyDiscount/music_25 · データのリセット: 3.9 ms (545 → 549 ms)ApplyDiscount/music_25 · サンプルデータ投入: 10 ms (549 → 559 ms)ApplyDiscount/music_25 · 更新テスト: 0.3 ms (559 → 559 ms)ApplyDiscount/movies_50 · データのリセット: 4.2 ms (559 → 563 ms)ApplyDiscount/movies_50 · サンプルデータ投入: 10 ms (563 → 574 ms)ApplyDiscount/movies_50 · 更新テスト: 0.5 ms (574 → 574 ms)ApplyDiscount/games_0 · データのリセット: 4.0 ms (574 → 578 ms)ApplyDiscount/games_0 · サンプルデータ投入: 9.8 ms (578 → 588 ms)ApplyDiscount/games_0 · 更新テスト: 0.3 ms (588 → 588 ms)SearchProducts/product_0 · 参照テスト: 0.5 ms (602 → 602 ms)SearchProducts/product_2 · 参照テスト: 8.8 ms (602 → 611 ms)GetOrder/orders_6_16_26_36 · 参照テスト: 1.3 ms (611 → 613 ms)TopProducts/top_10 · 参照テスト: 0.7 ms (613 → 613 ms)TopProducts/top_20 · 参照テスト: 0.8 ms (613 → 614 ms)並列枠 2SearchProducts/product_5 · 参照テスト: 7.8 ms (602 → 610 ms)ListOrders/user_64 · 参照テスト: 0.4 ms (610 → 610 ms)ListOrders/user_43 · 参照テスト: 0.3 ms (610 → 610 ms)ListOrders/user_36 · 参照テスト: 0.3 ms (610 → 611 ms)ListOrders/user_22 · 参照テスト: 0.1 ms (611 → 611 ms)ListOrders/user_15 · 参照テスト: 0.4 ms (611 → 611 ms)GetOrder/orders_8_18_28_38 · 参照テスト: 0.9 ms (611 → 612 ms)GetOrder/orders_3_13_23_33 · 参照テスト: 1.6 ms (612 → 614 ms)TopProducts/top_8 · 参照テスト: 1.0 ms (614 → 615 ms)並列枠 3SearchProducts/product_3 · 参照テスト: 7.8 ms (602 → 610 ms)ListOrders/user_57 · 参照テスト: 1.0 ms (610 → 611 ms)GetOrder/orders_1_11_21_31 · 参照テスト: 1.3 ms (611 → 612 ms)GetOrder/orders_2_12_22_32 · 参照テスト: 1.3 ms (612 → 613 ms)TopProducts/top_3 · 参照テスト: 0.4 ms (613 → 614 ms)TopProducts/top_2 · 参照テスト: 0.8 ms (614 → 615 ms)並列枠 4SearchProducts/product_9 · 参照テスト: 8.4 ms (602 → 610 ms)ListOrders/user_29 · 参照テスト: 1.0 ms (610 → 611 ms)GetOrder/orders_5_15_25_35 · 参照テスト: 1.7 ms (612 → 613 ms)TopProducts/top_30 · 参照テスト: 1.2 ms (613 → 614 ms)並列枠 5SearchProducts/product_4 · 参照テスト: 6.7 ms (602 → 609 ms)RevenueByCategory/Movies · 参照テスト: 0.5 ms (609 → 609 ms)ListOrders/user_71 · 参照テスト: 0.3 ms (609 → 610 ms)ListOrders/user_50 · 参照テスト: 1.0 ms (610 → 611 ms)GetOrder/orders_10_20_30_40 · 参照テスト: 4.8 ms (611 → 616 ms)並列枠 6SearchProducts/product_7 · 参照テスト: 8.7 ms (602 → 611 ms)GetOrder/orders_9_19_29_39 · 参照テスト: 1.5 ms (611 → 612 ms)TopProducts/top_1 · 参照テスト: 1.0 ms (612 → 613 ms)TopProducts/top_15 · 参照テスト: 4.0 ms (613 → 617 ms)並列枠 7SearchProducts/product_8 · 参照テスト: 0.8 ms (602 → 603 ms)SearchProducts/product_1 · 参照テスト: 0.4 ms (603 → 603 ms)RevenueByCategory/Books · 参照テスト: 0.9 ms (603 → 604 ms)ListOrders/user_8 · 参照テスト: 0.9 ms (604 → 605 ms)RevenueByCategory/Outdoors · 参照テスト: 0.6 ms (605 → 606 ms)RevenueByCategory/Sports · 参照テスト: 0.1 ms (606 → 606 ms)RevenueByCategory/Tools · 参照テスト: 0.1 ms (606 → 606 ms)RevenueByCategory/Kitchen · 参照テスト: 0.1 ms (606 → 606 ms)RevenueByCategory/Garden · 参照テスト: 0.2 ms (606 → 607 ms)RevenueByCategory/Toys · 参照テスト: 1.7 ms (607 → 608 ms)RevenueByCategory/Games · 参照テスト: 0.7 ms (608 → 609 ms)RevenueByCategory/Music · 参照テスト: 2.5 ms (609 → 611 ms)GetOrder/orders_7_17_27_37 · 参照テスト: 1.7 ms (611 → 613 ms)TopProducts/top_50 · 参照テスト: 0.8 ms (613 → 614 ms)並列枠 8SearchProducts/product_6 · 参照テスト: 9.3 ms (602 → 612 ms)GetOrder/orders_4_14_24_34 · 参照テスト: 1.7 ms (612 → 613 ms)TopProducts/top_5 · 参照テスト: 3.9 ms (614 → 617 ms)スイート開始からのミリ秒
docker run 共有サーバー 1 台 2.48 s 合計公式イメージ。書き込みテストはリセットを挟んで順番に走るコピーはなく、参照テスト 50 本と更新テスト 20 本が 1 つのデータベースを共有します。
docker run 共有サーバー 1 台: 代表実行のタイムライン, 2.48 s0500100015002000合計 2.48 sTestMainTestMain · DB 起動: 1.55 s (0.0 → 1.55 s ms)1.55 sTestMain · スキーマ投入 + マスタデータ投入: 97 ms (1.55 s → 1.65 s ms)97共有データベース(参照テスト)共有データベース(参照テスト) · データのリセット: 5.9 ms (2.39 s → 2.39 s ms)共有データベース(参照テスト) · サンプルデータ投入: 23 ms (2.39 s → 2.42 s ms)並列枠 1CreateOrder/two_lines · データのリセット: 10 ms (1.65 s → 1.66 s ms)CreateOrder/two_lines · サンプルデータ投入: 31 ms (1.66 s → 1.69 s ms)CreateOrder/two_lines · 更新テスト: 2.5 ms (1.69 s → 1.69 s ms)CreateOrder/one_line · データのリセット: 9.3 ms (1.69 s → 1.7 s ms)CreateOrder/one_line · サンプルデータ投入: 27 ms (1.7 s → 1.73 s ms)CreateOrder/one_line · 更新テスト: 1.6 ms (1.73 s → 1.73 s ms)CreateOrder/five_lines · データのリセット: 9.8 ms (1.73 s → 1.74 s ms)CreateOrder/five_lines · サンプルデータ投入: 26 ms (1.74 s → 1.76 s ms)CreateOrder/five_lines · 更新テスト: 2.3 ms (1.76 s → 1.77 s ms)CreateOrder/out_of_stock · データのリセット: 8.4 ms (1.77 s → 1.77 s ms)CreateOrder/out_of_stock · サンプルデータ投入: 25 ms (1.77 s → 1.8 s ms)CreateOrder/out_of_stock · 更新テスト: 0.4 ms (1.8 s → 1.8 s ms)CancelOrder/paid · データのリセット: 7.7 ms (1.8 s → 1.81 s ms)CancelOrder/paid · サンプルデータ投入: 26 ms (1.81 s → 1.83 s ms)CancelOrder/paid · 更新テスト: 2.7 ms (1.83 s → 1.84 s ms)CancelOrder/pending · データのリセット: 7.6 ms (1.84 s → 1.84 s ms)CancelOrder/pending · サンプルデータ投入: 28 ms (1.84 s → 1.87 s ms)CancelOrder/pending · 更新テスト: 1.9 ms (1.87 s → 1.87 s ms)CancelOrder/another_paid · データのリセット: 8.4 ms (1.87 s → 1.88 s ms)CancelOrder/another_paid · サンプルデータ投入: 27 ms (1.88 s → 1.91 s ms)CancelOrder/another_paid · 更新テスト: 1.7 ms (1.91 s → 1.91 s ms)CancelOrder/shipped · データのリセット: 9.3 ms (1.91 s → 1.92 s ms)CancelOrder/shipped · サンプルデータ投入: 25 ms (1.92 s → 1.95 s ms)CancelOrder/shipped · 更新テスト: 0.4 ms (1.95 s → 1.95 s ms)ShipOrder/one_paid · データのリセット: 11 ms (1.95 s → 1.96 s ms)ShipOrder/one_paid · サンプルデータ投入: 27 ms (1.96 s → 1.98 s ms)ShipOrder/one_paid · 更新テスト: 1.1 ms (1.98 s → 1.98 s ms)ShipOrder/pending_rejected · データのリセット: 7.7 ms (1.98 s → 1.99 s ms)ShipOrder/pending_rejected · サンプルデータ投入: 26 ms (1.99 s → 2.02 s ms)ShipOrder/pending_rejected · 更新テスト: 0.2 ms (2.02 s → 2.02 s ms)ShipOrder/all_paid · データのリセット: 8.6 ms (2.02 s → 2.03 s ms)ShipOrder/all_paid · サンプルデータ投入: 26 ms (2.03 s → 2.05 s ms)ShipOrder/all_paid · 更新テスト: 13 ms (2.05 s → 2.07 s ms)ShipOrder/twice · データのリセット: 8.2 ms (2.07 s → 2.07 s ms)ShipOrder/twice · サンプルデータ投入: 30 ms (2.07 s → 2.1 s ms)ShipOrder/twice · 更新テスト: 0.8 ms (2.1 s → 2.11 s ms)DeleteUser/user_15 · データのリセット: 5.9 ms (2.11 s → 2.11 s ms)DeleteUser/user_15 · サンプルデータ投入: 41 ms (2.11 s → 2.15 s ms)DeleteUser/user_15 · 更新テスト: 1.6 ms (2.15 s → 2.15 s ms)DeleteUser/user_22 · データのリセット: 5.9 ms (2.15 s → 2.16 s ms)DeleteUser/user_22 · サンプルデータ投入: 26 ms (2.16 s → 2.19 s ms)DeleteUser/user_22 · 更新テスト: 1.3 ms (2.19 s → 2.19 s ms)DeleteUser/user_29 · データのリセット: 6.9 ms (2.19 s → 2.19 s ms)DeleteUser/user_29 · サンプルデータ投入: 25 ms (2.19 s → 2.22 s ms)DeleteUser/user_29 · 更新テスト: 1.4 ms (2.22 s → 2.22 s ms)DeleteUser/user_36 · データのリセット: 6.6 ms (2.22 s → 2.23 s ms)DeleteUser/user_36 · サンプルデータ投入: 27 ms (2.23 s → 2.25 s ms)DeleteUser/user_36 · 更新テスト: 1.1 ms (2.25 s → 2.26 s ms)ApplyDiscount/books_10 · データのリセット: 5.8 ms (2.26 s → 2.26 s ms)ApplyDiscount/books_10 · サンプルデータ投入: 26 ms (2.26 s → 2.29 s ms)ApplyDiscount/books_10 · 更新テスト: 1.2 ms (2.29 s → 2.29 s ms)ApplyDiscount/music_25 · データのリセット: 5.9 ms (2.29 s → 2.29 s ms)ApplyDiscount/music_25 · サンプルデータ投入: 28 ms (2.29 s → 2.32 s ms)ApplyDiscount/music_25 · 更新テスト: 1.1 ms (2.32 s → 2.32 s ms)ApplyDiscount/movies_50 · データのリセット: 6.0 ms (2.32 s → 2.33 s ms)ApplyDiscount/movies_50 · サンプルデータ投入: 26 ms (2.33 s → 2.35 s ms)ApplyDiscount/movies_50 · 更新テスト: 1.0 ms (2.35 s → 2.36 s ms)ApplyDiscount/games_0 · データのリセット: 5.6 ms (2.36 s → 2.36 s ms)ApplyDiscount/games_0 · サンプルデータ投入: 24 ms (2.36 s → 2.39 s ms)ApplyDiscount/games_0 · 更新テスト: 1.3 ms (2.39 s → 2.39 s ms)RevenueByCategory/Books · 参照テスト: 2.6 ms (2.42 s → 2.42 s ms)RevenueByCategory/Tools · 参照テスト: 1.0 ms (2.42 s → 2.42 s ms)RevenueByCategory/Music · 参照テスト: 0.6 ms (2.42 s → 2.42 s ms)ListOrders/user_8 · 参照テスト: 2.4 ms (2.42 s → 2.42 s ms)ListOrders/user_43 · 参照テスト: 0.5 ms (2.42 s → 2.42 s ms)ListOrders/user_71 · 参照テスト: 0.4 ms (2.42 s → 2.42 s ms)ListOrders/user_64 · 参照テスト: 0.3 ms (2.42 s → 2.42 s ms)ListOrders/user_57 · 参照テスト: 1.2 ms (2.42 s → 2.43 s ms)ListOrders/user_22 · 参照テスト: 0.7 ms (2.43 s → 2.43 s ms)ListOrders/user_36 · 参照テスト: 0.2 ms (2.43 s → 2.43 s ms)ListOrders/user_29 · 参照テスト: 0.2 ms (2.43 s → 2.43 s ms)ListOrders/user_15 · 参照テスト: 0.2 ms (2.43 s → 2.43 s ms)TopProducts/top_1 · 参照テスト: 1.1 ms (2.43 s → 2.43 s ms)TopProducts/top_15 · 参照テスト: 0.7 ms (2.43 s → 2.43 s ms)TopProducts/top_10 · 参照テスト: 0.6 ms (2.43 s → 2.43 s ms)SearchProducts/product_0 · 参照テスト: 1.1 ms (2.43 s → 2.43 s ms)TopProducts/top_50 · 参照テスト: 0.8 ms (2.43 s → 2.43 s ms)SearchProducts/product_8 · 参照テスト: 1.2 ms (2.43 s → 2.43 s ms)GetOrder/orders_10_20_30_40 · 参照テスト: 4.0 ms (2.43 s → 2.44 s ms)並列枠 2RevenueByCategory/Garden · 参照テスト: 9.0 ms (2.42 s → 2.43 s ms)ListOrders/user_50 · 参照テスト: 3.4 ms (2.43 s → 2.43 s ms)TopProducts/top_8 · 参照テスト: 2.0 ms (2.43 s → 2.43 s ms)SearchProducts/product_3 · 参照テスト: 1.8 ms (2.43 s → 2.43 s ms)GetOrder/orders_8_18_28_38 · 参照テスト: 3.0 ms (2.43 s → 2.44 s ms)並列枠 3RevenueByCategory/Outdoors · 参照テスト: 11 ms (2.42 s → 2.43 s ms)TopProducts/top_20 · 参照テスト: 1.6 ms (2.43 s → 2.43 s ms)TopProducts/top_3 · 参照テスト: 0.9 ms (2.43 s → 2.43 s ms)TopProducts/top_2 · 参照テスト: 0.7 ms (2.43 s → 2.43 s ms)SearchProducts/product_2 · 参照テスト: 1.0 ms (2.43 s → 2.43 s ms)SearchProducts/product_6 · 参照テスト: 0.5 ms (2.43 s → 2.43 s ms)GetOrder/orders_9_19_29_39 · 参照テスト: 2.0 ms (2.43 s → 2.43 s ms)GetOrder/orders_3_13_23_33 · 参照テスト: 1.9 ms (2.43 s → 2.44 s ms)並列枠 4RevenueByCategory/Sports · 参照テスト: 12 ms (2.42 s → 2.43 s ms)TopProducts/top_5 · 参照テスト: 1.5 ms (2.43 s → 2.43 s ms)SearchProducts/product_5 · 参照テスト: 2.5 ms (2.43 s → 2.43 s ms)GetOrder/orders_6_16_26_36 · 参照テスト: 2.8 ms (2.43 s → 2.44 s ms)並列枠 5RevenueByCategory/Games · 参照テスト: 14 ms (2.42 s → 2.43 s ms)SearchProducts/product_4 · 参照テスト: 1.4 ms (2.43 s → 2.43 s ms)SearchProducts/product_7 · 参照テスト: 0.4 ms (2.43 s → 2.43 s ms)GetOrder/orders_1_11_21_31 · 参照テスト: 6.0 ms (2.43 s → 2.44 s ms)並列枠 6RevenueByCategory/Movies · 参照テスト: 17 ms (2.42 s → 2.43 s ms)GetOrder/orders_4_14_24_34 · 参照テスト: 3.9 ms (2.43 s → 2.44 s ms)並列枠 7RevenueByCategory/Toys · 参照テスト: 15 ms (2.42 s → 2.43 s ms)SearchProducts/product_1 · 参照テスト: 1.9 ms (2.43 s → 2.43 s ms)GetOrder/orders_5_15_25_35 · 参照テスト: 2.6 ms (2.43 s → 2.44 s ms)並列枠 8RevenueByCategory/Kitchen · 参照テスト: 11 ms (2.42 s → 2.43 s ms)TopProducts/top_30 · 参照テスト: 3.0 ms (2.43 s → 2.43 s ms)SearchProducts/product_9 · 参照テスト: 2.0 ms (2.43 s → 2.43 s ms)GetOrder/orders_7_17_27_37 · 参照テスト: 2.9 ms (2.43 s → 2.44 s ms)GetOrder/orders_2_12_22_32 · 参照テスト: 2.8 ms (2.44 s → 2.44 s ms)スイート開始からのミリ秒

ノードごとの時間

ノードpgmemTestcontainers 共有サーバー 1 台PostgreSQL 共有サーバー 1 台docker run 共有サーバー 1 台
DB 起動39 ms761 ms192 ms1.55 s
スキーマ投入 + マスタデータ投入47 ms108 ms57 ms97 ms
スナップショット3.2 ms———
フォーク(更新テスト専用のコピー)218 ms———
サンプルデータ投入288 ms624 ms231 ms570 ms
データのリセット—140 ms111 ms161 ms
参照テスト61 ms161 ms105 ms163 ms
更新テスト16 ms21 ms10 ms38 ms
実時間(起動 + テストバイナリ)204 ms1.73 s646 ms2.48 s

コピーやテストごとの値を合算しています。pgmem では各コピーが同時に走るため、合算値は実時間を超えます。

バーはそれぞれ実行モデルの 1 ノードで、テストバイナリの中で計っています (MODELCASE_TRACE)。外部サーバーの起動は、app データベースで SELECT 1 が通るまでをドライバが計り、テストバイナリの実時間も計ります。合計は起動と テストバイナリの和で、ノードに含まれない数ミリ秒はバイナリ自身の起動と 終了です。各タイムラインは合計時間が中央値だった実行で、ビルド直後の 初回実行はウォームアップとして記録しません。go test の -parallel は 既定の GOMAXPROCS です。タイムラインはすべて同じ時間軸です。

読み取れること:

  • 共有サーバーは更新テストごとに払います。 リセットとサンプルデータ 投入のコストは、pgmem のフォークとサンプルデータ投入とほぼ同じですが、 共有サーバーではそれが直列に、フォークでは横に並んで走ります。
  • pgmem の固定費は起動とスナップショットで、どちらもネイティブ サーバーの起動より小さく、コンテナとは比べものになりません。
  • フォークは軽く、重なって進みます。 フォークはデータディレクトリを copy-on-write でクローンし(ツリーだけ複製し、ファイルの中身は書き込む まで共有)、共有メモリを二重にゼロ埋めしなくなったバックエンドを起動する ので、1 つだけなら約 6 ms です。8 つ同時だとページフォルトで競合して 1 つあたり 10 ms ほどになりますが、20 本のフォークとサンプル投入は 実時間 120 ms ほどに収まります。
  • 共有サーバー上の参照テストはトランザクション境界で直列化されます (pgmem のサーバー 1 つにつきバックエンドセッションは 1 つ)。そのため pgmem では、マルチプロセスのサーバーより 1 本ずつは少し遅くなります。どちらに しても短い時間です。
ターミナルウィンドウ
cd bench/modelcase
RUNS=5 ./run.sh # pgmem、Testcontainers、devbox、docker
TARGETS="pgmem devbox" ./run.sh # Docker なし

スクリプトはテストバイナリを 1 回コンパイルし、対象ごとにドライバを走らせて results/raw.jsonl(各実行とそのスパン)、results/summary.json、そして このページが描画する website/src/data/modelcase.json を書きます。同じ ディレクトリで go test ./... を実行すると、トレースなしの普通のテスト として pgmem 上でスイートが走ります。

起動〜最初のクエリテストごとの複製インデックス SELECT20万行ソートDB と計測プロセスのメモリダウンロード
pgmem(Go ライブラリ)70 ms15 ms (フォーク)29 µs9 µs プロセス内接続117 ms103 MiB計測プロセスの増分 103 MiB33.1 MB (テストバイナリへのリンク増分)
pgmem バイナリ(Python / Java / Node.js)66 ms15 ms (フォーク)29 µs117 ms110 MiB16.3 MB (wheel / jar / npm の中身)
docker run1.65 s61 ms (CREATE DATABASE … TEMPLATE)93 µs259 ms77 MiBコンテナ使用量 76 MiB, 計測プロセスの増分 1 MiB, VM の差分 433 MiB, VM 絶対値 1335 MiB118 MB (イメージレイヤ)
Testcontainers(Go)1.09 s21 ms (Snapshot / Restore)102 µs258 ms137 MiBコンテナ使用量 134 MiB, 計測プロセスの増分 2 MiB, VM の差分 295 MiB, VM 絶対値 1192 MiB120 MB (イメージレイヤ + Ryuk)
devbox(nix の PostgreSQL)411 ms83 ms (CREATE DATABASE … TEMPLATE)28 µs228 ms36 MiBPostgreSQL プロセス合計113 MB (nix closure)

2026-09-18 に計測した pgmem とバイナリの中央値(5 回)。Apple M3、8 コア、16 GB、Darwin 27.0.0。OrbStack 2.2.3(Docker 29.4.0)、arm64。Docker、Testcontainers、devbox の比較値は 2026-09-14 の基準値です。メモリ列は DB 使用量と計測プロセスの増分を比べます。Testcontainers は PostgreSQL と Ryuk のコンテナ使用量を含みます。VM の差分と絶対値は参考値として分けており、OrbStack がメモリを解放すると差分は小さくなります。

ベンチマーク中の DB と計測プロセスのメモリ

ベンチマーク中の DB と計測プロセスのメモリ棒は中央値、ひげは各回の最小値から最大値です。Docker と Testcontainers はコンテナ使用量と計測プロセスの増分を合算します。Testcontainers には PostgreSQL と Ryuk が含まれます。OrbStack VM は負荷中にメモリを解放することがあるため、VM の差分は別に示します。スキーマ準備後query・分離計測後0100200300400500pgmem(Go ライブラリ)103 MiB (103–135)445 MiB (430–478)pgmem バイナリ110 MiB (109–110)docker run77 MiB (76–77)92 MiB (92–93)Testcontainers(Go)137 MiB (136–137)180 MiB (177–180)devbox36 MiB (36–36)54 MiB (50–54)DB と計測プロセスのメモリ (MiB)
棒は中央値、ひげは各回の最小値から最大値です。Docker と Testcontainers はコンテナ使用量と計測プロセスの増分を合算します。Testcontainers には PostgreSQL と Ryuk が含まれます。OrbStack VM は負荷中にメモリを解放することがあるため、VM の差分は別に示します。

エクスポートを絞った AOT ビルドで、pgmem ライブラリと単独バイナリの行を 2026-09-18 に再計測しました。起動・メモリなどは各 5 回、Go ベンチマークは 3 回実行しています。darwin/arm64 の strip 済みバイナリは 36.7 MB、zip の 配布物は 16.3 MB、strip 済み Go テストバイナリへリンクした増分は 33.1 MB でした。Docker、Testcontainers、devbox は再計測せず、比較行は 2026-09-14 の 基準値を残しています。

どの計測も、新しいプロセスでサーバーを 1 つ起動し、同じスキーマを流し込んでから測ります。ハーネスは bench/alternatives にあります。

  • 起動〜最初のクエリ:起動処理を呼び出してから、TCP 経由の SELECT 1 が成功するまで。docker pull と devbox install は計測前に実行し、Devbox 環境の解決も計測外の準備で済ませます。docker run は新規コンテナと DB クラスタの初期化を含みます。Devbox は初期化済みの永続クラスタと app DB を計測前に準備し、devbox services up -b の実行から SQL ready までを計ります。Testcontainers は新しいテストプロセスが起動する Ryuk コンテナも含みます。pgmem バイナリは ready 行が出るまでを計り、Python、Java、Node.js のラッパーはその行を待ちます。
  • テストごとの複製:準備済みデータベース(ユーザー 1,000 件、注文 10,000 件)の独立した複製を 20 回作り、そのたびに接続して結合クエリを 1 本流したときの中央値です。pgmem はスナップショットからフォークします。docker run と devbox は CREATE DATABASE … TEMPLATE と DROP DATABASE、Testcontainers は PostgreSQL モジュールの Snapshot と Restore を使います。後者も内部ではテンプレートデータベースで同じことをしています。
  • インデックス SELECT:pgx で SELECT v FROM bench WHERE id = $1 をウォームアップ後に 3,000 回。pgmem の 2 つ目の値は、TCP の代わりにプロセス内ダイヤラ(Server.Dial)を使ったものです。
  • 20万行ソート:SELECT count(*) FROM (SELECT md5(i::text) AS h FROM generate_series(1, 200000) i ORDER BY h) t を、ウォームアップ 1 回の後に 3 回流した中央値です。
  • メモリ:負荷中に OrbStack VM がメモリを返すと、コンテナの使用量が多くても Testcontainers の値が docker run より小さく見えることがあります。そこでグラフは VM の差分を使わず、DB 側の使用量と計測プロセスの増分を比べます。pgmem はプロセスの phys_footprint 増分、バイナリは単独の pgmem プロセスを使います。Docker と Testcontainers は各コンテナの Docker 使用量に Go の計測プロセスの増分を足します。Testcontainers には PostgreSQL と Ryuk が含まれ、メモリ値には docker stats の表示を使います(Linux CLI はキャッシュを差し引きます)。devbox は PostgreSQL のポストマスターと子プロセスを合算します。OrbStack VM の差分と絶対値は表に分けて載せています。
  • ダウンロード:初回に取得するもの。Go ライブラリとしての pgmem は、strip したテストバイナリがリンクによって増える量です。バイナリの行は wheel、jar、npm パッケージが同梱する圧縮済みバイナリの大きさです。イメージは計測したアーキテクチャの圧縮レイヤ、nix closure は devbox が cache.nixos.org から取得する量です。
  • 既定値が違います。 サーバーは PostgreSQL の既定値(shared_buffers=128MB)を使います。Testcontainers の計測では PostgreSQL 18 のデータディレクトリ(/var/lib/postgresql/18/docker)を tmpfs にマウントし、docker run と devbox はディスクを使います。pgmem は shared_buffers=32MB でファイルシステムもメモリ上にあるため、一時ファイルにあふれるソートでもディスクに触れません。
  • グラフは DB と計測プロセスのメモリを比べます。 スキーマ準備後とクエリ・分離計測後の中央値および計測回ごとの範囲を示します。Testcontainers は PostgreSQL と Ryuk のコンテナ使用量を含みます。Linux の docker stats CLI は表示値からキャッシュを差し引きます。
  • OrbStack VM の差分は別の参考値です。 コンテナの計測ごとに VM を再起動し、アイドル時を記録します。VM は実行中にメモリを解放することがあり、コンテナ使用量が増えても VM の差分が下がる場合があります。表では差分と VM の絶対値を分けています。
  • pgmem のメモリは負荷で増えます。 WebAssembly のリニアメモリはサーバー稼働中は OS に返らず、生きているフォークはそれぞれ自分の複製を持ちます。生きているフォーク 1 つあたりアイドル時の値程度を見込み、MaxForks で数を抑えてください。
  • コンテナ方式の差には実行条件も含まれます。 docker run はディスク上に保存しますが、Testcontainers は PGDATA を tmpfs に置き、Ryuk も起動します。そのため、差には保存先と起動方式の違いが含まれます。
ターミナルウィンドウ
cd bench/alternatives
RUNS=5 MEM_RUNS=3 ./run.sh

OrbStack と devbox が必要です。メモリ計測のパスでは OrbStack を再起動しますが、ほかのコンテナが動いているときは再起動せずに止まります。生の計測値を results/raw.jsonl、中央値を results/summary.json に書き、要約を website/src/data/benchmarks.json にコピーします。このサイトの表はそのファイルを描画しています。