Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
次なるpkg/errorsを探して
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takayuki Miyahara
June 15, 2023
Programming
1.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
次なるpkg/errorsを探して
Takayuki Miyahara
June 15, 2023
More Decks by Takayuki Miyahara
See All by Takayuki Miyahara
ブログのリアクションから始めるGoのパフォーマンス分析入門
always_allokay
0
450
Other Decks in Programming
See All in Programming
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
220
開発体験を左右するライブラリの API 設計 - GraphQL スキーマ構築ライブラリから考える #tskaigi
izumin5210
2
1.6k
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
450
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
470
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
Inside Stream API
skrb
1
650
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
3.2k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.8k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
oxlintはeslint/typescript-eslintを置き換えられるのか
shomafujita
2
320
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
110
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
840
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
エンジニアに許された特別な時間の終わり
watany
107
250k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
My Coaching Mixtape
mlcsv
0
140
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
220
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Un-Boring Meetings
codingconduct
0
310
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Transcript
次なるpkg/errorsを探して 宮原 孝行 【Gophers Talk】LT & カンファレンス感想戦 2023/06/15
Copyright Kanmu, Inc. All right reserved. 2 宮原 孝行 software
engineer at Kanmu, Inc. @miyataka @always_allokay 自己紹介
Copyright Kanmu, Inc. All right reserved. 3 発表の目的 pkg/errors とはなにか
移行先に求めるもの 移行の選択肢 評価 1 2 3 目次 4 5
発表の目的 1
Copyright Kanmu, Inc. All right reserved. 発表の目的 5 1 pkg/errorsの移行先を探すための参考情報を提供すること
pkg/errors とはなにか 2
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 7 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 8 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットである
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 9 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • > Package errors provides simple error handling primitives. • 直訳: エラーハンドリングの基礎を提供するライブラリ • エラーにスタックトレースを付与できる • 標準errorsのスーパーセットであるあった
Copyright Kanmu, Inc. All right reserved. pkg/errors とはなにか 10 2
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • なぜ移行したいのか? ◦ Go1.20でerrorsパッケージに1.13以来の変更が入り、Go本体との差分が 発生した ◦ 2021年12月にPublic Archiveとなり、メンテが行われなくなっている https://go.googlesource.com/proposal/+/master/design/go2draft.md https://go.dev/doc/go1.20
移行先に求めるもの 3
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 12 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ • スタックトレースのサポート • 性能が大きく劣化しないこと
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 13 3 •
移行のしやすさ ◦ 標準errors、pkg/errorsとの互換性 ▪ 関数、メソッドのシグニチャが一致しているか ▪ 機能をもれなくカバーしているか
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 14 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • スタックトレースのサポート ◦ どの処理から呼び出されたかなど、バグ解消に直結する情報を含むので 重要 ◦ pkg/errorsがカバーしていた範囲を引き継ぐ必要がある
Copyright Kanmu, Inc. All right reserved. 移行先に求めるもの 15 3 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能が大きく劣化しないこと ◦ 速いは正義 ◦ メモリフットプリントは小さいほどよい
移行の選択肢 4
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 17 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ ◦ cockroachdb/errors ◦ goark/errs
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 18 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ◦ morikuni/failure ◦ 標準ライブラリを使った自前実装
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 19 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 一度候補となったものの、細かい調査の対象外としたもの ◦ x/xerrors ▪ もともと、前回の標準errors改修タイミング(Go1.13リリース時)の橋渡 しとしての位置付け ▪ すでに大部分がdeprecatedである ◦ morikuni/failure ▪ エラーコードベースのハンドリングを前提 ◦ 標準ライブラリを使った自前実装 ▪ 自社固有の要件がない
Copyright Kanmu, Inc. All right reserved. 移行の選択肢 20 4 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 最終的な候補は以下の2つ(再掲) ◦ cockroachdb/errors ◦ goark/errs • 移行先に求めるもの(再掲) ◦ 移行のしやすさ ◦ スタックトレースのサポート ◦ 性能が大きく劣化しないこと
評価 5
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 22 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 https://github.com/cockroachdb/errors/issues/99
Copyright Kanmu, Inc. All right reserved. 評価: cockroachdb/errors 23 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装だが、Issueで対応中 ◦ pkg/errorsとの互換性 ▪ スーパーセットとなっている。置き換えだけで移行可能 • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 24 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり
Copyright Kanmu, Inc. All right reserved. 評価: goark/errs 25 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 移行のしやすさ ◦ 標準errorsとの互換性 ▪ Go1.20で追加されたJoinは未実装 ◦ pkg/errorsとの互換性 ▪ Wrap、Newなど一部は互換性あり • スタックトレースのサポート ◦ サポートされている • 性能が大きく劣化しないこと ◦ 後述
Copyright Kanmu, Inc. All right reserved. 評価: ベンチマーク 26 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • 性能評価としてマイクロベンチマークをとる ◦ 標準errors, pkg/errors, cockroachdb/errors, goark/errsの4つを比較 ◦ 実行したベンチマーク ▪ ネストしたerror生成時の速度とフットプリント ▪ スタックトレース出力時の速度とフットプリント ※ベンチマークテストコードは以下のレポジトリ https://github.com/miyataka/benchmark_pkg_errors_alternatives
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ pkg/errors
(baseline) ▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8249 ns/op, 304 B/op, 3 allocs/op ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 12849 ns/op, 3716 B/op, 33 allocs/op 評価: ベンチマーク 27 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ cockroachdb/errors
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 8640 ns/op, 416 B/op, 7 allocs/op • 速度約5%pt、メモリ使用量約37%pt悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 14867 ns/op, 17222 B/op, 22 allocs/op • 速度が約15%pt、メモリ使用量が約4.6倍に悪化 評価: ベンチマーク 28 5
Copyright Kanmu, Inc. All right reserved. • 結果 ◦ goark/errs
▪ ネストしたerror生成時の速度とフットプリント • 1000回ネスト => 7885 ns/op, 648 B/op, 7 allocs/op • 速度約4.5pt改善、メモリ使用量は約2倍に悪化 ▪ スタックトレース出力時の速度とフットプリント • 60回ネスト => 1896 ns/op, 1401 B/op, 33 allocs/op • 速度が約6倍改善、メモリ使用量は63%pt改善 評価: ベンチマーク 29 5 ※ただし、マイクロベンチマークであり、実際の環境では異なる結果となる可能性があることに注意 すること
Copyright Kanmu, Inc. All right reserved. 評価: まとめ 30 5
テキストを入れたり。テキストを入れたり。テキストを入れたり。テ キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 package 標準errorsとの 互換性 pkg/errorsとの 互換性 スタックトレースの サポート 性能 標準errors - - ❌ - pkg/errors ❌※1 ※2 - ⭕ baseline cockroachdb/errors 🔺※1 ⭕ ⭕ 🔺 goark/errs 🔺※1 🔺 ⭕ ⭕ ※1 いずれもGo1.13時点の互換性あり. Go1.20のJoinは未実装 ※2 今後サポートされる見込みがないため、相対的に悪い評価とした
Copyright Kanmu, Inc. All right reserved. 全体のまとめ 31 5 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • pkg/errors移行先: cockroachdb/errors ◦ pkg/errorsのスーパーセットとなっており、置き換えが容易 ◦ 性能劣化するが、自社のユースケースでは影響度は小さい • ネットワーク >>>> パッケージ移行による速度劣化
Copyright Kanmu, Inc. All right reserved. 参考文献 32 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://go.googlesource.com/go/+/refs/heads/master/src/errors/ • https://github.com/pkg/errors • https://github.com/cockroachdb/errors • https://github.com/goark/errs • https://go.googlesource.com/proposal/+/master/design/go2draft.md • https://go.dev/doc/go1.20 • https://go.dev/doc/go1.13 • https://go.googlesource.com/xerrors/
Copyright Kanmu, Inc. All right reserved. 参考文献 33 6 テキストを入れたり。テキストを入れたり。テキストを入れたり。テ
キストを入れたり。テキストを入れたり。テキストを入れたり。テキ ストを入れたり。テキストを入れたり。 • https://github.com/morikuni/failure • https://speakerdeck.com/morikuni/designing-errors • https://future-architect.github.io/articles/20230123a/ • https://future-architect.github.io/articles/20230126a/ • https://zenn.dev/nekoshita/articles/097e00c6d3d1c9 • https://text.baldanders.info/golang/error-handling/ • https://zenn.dev/spiegel/books/error-handling-in-golang • https://speakerdeck.com/syumai/godesutatukutoresuwoxi-ufang-fa-ga yayakosiijian-nituite