コンテンツにスキップ

ベンチマーク

プロジェクトには目的の異なる 2 つの独立したベンチマークセットアップがあります:

継続的ベンチマーク:ソースと結果は https://github.com/ringsaturn/tz-benchmark、可視化は https://ringsaturn.github.io/tz-benchmark/ で確認できます。各リリース時に GitHub Actions で自動実行され、パッケージ間の比較を行います。 GitHub Actions ランナーは開発マシンとハードウェアが異なるため、絶対値はローカル実行と異なりますが、パッケージ間の相対的な傾向が重要です。リポジトリの snapshot/ にある日付付きスナップショットは別物です。こちらは以下の表と同じ Apple M3 Max 上でローカルに取得されているため、絶対値をこのページと直接比較できます。

ローカルベンチマーク:以下の表は Apple M3 Max 搭載 MacBook Pro で測定されました。これらは最新ハードウェアにおける実際のレイテンシをより代表するものです。

方法論

各ファインダーは一度初期化され、すべてのクエリで再利用されます。これは推奨される本番環境パターンです。クエリは世界都市座標の代表サンプルと意図的な境界エッジケースポイントを使用します。

以下には 2 種類の異なるメモリ指標が登場し、両者は互換ではありません。 Go の表が示すのは常駐メモリ(ファインダーがクエリを処理できる状態になった後も保持している分)、 Rust と Python の表が示すのはピーク RSS(ロード中に到達する高水位)です。後者が数倍大きいのは、ファインダーの構築時に .pb データセット全体を中間表現へデコードしてから破棄するためであり、またメモリを解放してもページはカーネルに返却されないためです。 Go の数値と Rust の数値を同じ測定として読まないでください。同一の測定における両指標の並列比較はtzf はどのくらいメモリを使用しますか?を参照してください。

Go (tzf v1.2.3)

TargetDatasetScenarioMedian (ns)p99 (ns)Approx throughput (ops/s)常駐 (MiB)
DefaultFindertopology-simplified + preindexedge case · GetTimezoneName625.02250.01083.8K31.90
FuzzyFinderpreindexedge case · GetTimezoneName250.0542.03216.5K2.40
Findertopology-simplifiededge case · GetTimezoneName334.01667.02145.0K29.70
FullFinderfull-precision + preindexedge case · GetTimezoneName709.02875.01111.7K155.30
Finderfull-precisionedge case · GetTimezoneName416.02709.01652.6K153.00
DefaultFindertopology-simplified + preindexrandom world cities · GetTimezoneName208.01208.03283.0K31.90
FuzzyFinderpreindexrandom world cities · GetTimezoneName208.0542.03717.5K2.40
Findertopology-simplifiedrandom world cities · GetTimezoneName292.02208.02058.0K29.70
FullFinderfull-precision + preindexrandom world cities · GetTimezoneName208.01375.03147.6K155.30
Finderfull-precisionrandom world cities · GetTimezoneName333.01959.01993.6K153.00
Findertopology-simplified + GridIndexrandom world cities · GetTimezoneName250.01667.02387.2K29.70
Findertopology-simplified (no GridIndex)random world cities · GetTimezoneName2292.04375.0471.7K24.00
DefaultFindertopology-simplified + preindexrandom world cities · GetTimezoneNames625.03833.0971.8K31.90
FuzzyFinderpreindexrandom world cities · GetTimezoneNames209.0583.03534.8K2.40
Findertopology-simplifiedrandom world cities · GetTimezoneNames583.02833.01277.3K29.70
FullFinderfull-precision + preindexrandom world cities · GetTimezoneNames709.03292.01059.0K155.30

Rust (tzf-rs v1.3.6)

Topology-Simplified (bundled) / Random Cities

TargetDatasetScenarioMedian estimate (µs)Approx throughput (ops/s)初期化ピーク RSS (MiB) 平均
Findertopology-simplifiedYStripes only0.56981,755,03369.72
Findertopology-simplifiedNo index4.9164203,40142.46
DefaultFindertopology-simplified + preindexYStripes only0.30403,289,36582.10
DefaultFindertopology-simplified + preindexNo index5.0438198,26358.11

Topology-Simplified (bundled) / Edge Cities (FuzzyFinder misses)

TargetDatasetScenarioMedian estimate (µs)Approx throughput (ops/s)
FuzzyFinderpreindexFuzzyFinder miss0.15646,393,044
DefaultFinder (YStripes)topology-simplified + preindexDefaultFinder (YStripes) fallback0.62561,598,338
Findertopology-simplifiedYStripes0.44212,261,676
Findertopology-simplifiedNo index4.9164203,401
DefaultFindertopology-simplified + preindexYStripes0.60691,647,718
DefaultFindertopology-simplified + preindexNo index5.0438198,263

Full-Precision (full)

TargetDatasetScenarioMedian estimate (µs)Approx throughput (ops/s)初期化ピーク RSS (MiB) 平均
Finder (full)full-precisionYStripes only1.2227817,862314.59
Finder (full)full-precisionNo index43.052023,228157.02
DefaultFinder (full)full-precision + preindexYStripes only0.55271,809,136323.58
DefaultFinder (full)full-precision + preindexNo index7.4823133,649171.44

Python (tzfpy v1.3.2)

tzfpy は tzf-rs の PyO3 バインディングです。ベンチマークは pytest-benchmark を使用し、単一の get_tz() 呼び出し(ランダム座標、トポロジー簡略化データセット)を測定します。 Apple M3 Max 搭載 MacBook Pro での結果です。

インデックスモード中央値 (µs)平均 (µs)スループット (Kops/s)ピーク RSS
デフォルト(YStripes 有効)0.65330.67111490.1~70.5 MB
YStripes なし(_TZFPY_DISABLE_Y_STRIPES=11.64101.6548604.3~57.5 MB

呼び出しあたりのオーバーヘッドは生の Rust の数値と同程度です。tzf-rs の数値との差は PyO3 経由の Python → Rust FFI コストを反映しています。

主な観察結果

  • YStripes はポリゴン検索のレイテンシを大幅に短縮します。Rust の Finder では、完全精度データの中央値が 43.0520 µs から 1.2227 µs へ短縮され、35.2 倍高速になります。トポロジー簡略化データでは 4.9164 µs から 0.5698 µs へ短縮され、8.6 倍高速になります。
  • DefaultFinder は汎用用途で最も優れた Rust の選択肢です。中央値はトポロジー簡略化データで 0.3040 µs、完全精度データで 0.5527 µs です。プレインデックスによる初期化ピーク RSS の増加は、対応する YStripes 有効の Finder と比べて約 9 から 12 MiB です。
  • FuzzyFinder はフォールバックと組み合わせる高速パスに適しています。ミスは 0.1564 µs で完了し、DefaultFinder は同じ境界都市のワークロードを YStripes フォールバック経由で 0.6256 µs で解決します。単独利用は、クエリがタイムゾーン境界から離れていると分かっている場合に限って適しています。
  • Python でも YStripes の効果は顕著です。tzfpy の中央値は 1.6410 µs から 0.6533 µs へ短縮され、スループットは 604.3 Kops/s から 1490.1 Kops/s へ約 2.5 倍向上します。
  • 完全精度データには明確なメモリコストがあります。YStripes 有効時にトポロジー簡略化データから完全精度データへ切り替えると、Rust の初期化ピーク RSS は約 241 から 245 MiB 増加します。Go では、常駐メモリが約 30 MiB から約 153 から 155 MiB へ増加します。これらは方法論で説明した 2 つの異なる指標であるため、Rust と Go の増加量を直接比較することはできません。
  • 初期化ピークは tzf の運用コストそのものではありません。上記の Rust のピーク RSS は定常状態を約 2 〜 3 倍過大に見せています。同じマシンで測定した 2026-07-26 スナップショットでは、トポロジー簡略化データの DefaultFinder はピーク 77.0 MiB に対して常駐 36.3 MiB、Finder はピーク 48.0 MiB に対して常駐 20.7 MiB です。コンテナのメモリはピークに合わせ、長期運用のコストは常駐値で見積もってください。
最終更新日