Aniki::Internal
id:karupanerura
Okinawa.pm #5
だれ
• id:karupanerura (Twitter/Hatena/Github)
• Japan Perl Association / DeNA
• Perl/XS/Go/Crystal/Swift/Java/etc..
• CPAN Author
• Gotanda.pm / Mackerel UG Organizer
はじめに
• このトークでは一般的なORMの実装と対比し
てAnikiの実装について語ります
• スライドでは大まかな概要だけ説明します
• コードリーディングが中心なのでよくわから
ないなと思ったら積極的にdan the
interraptionをお願いします
あじぇんだ
• Anikiとは
• パフォーマンス向上のためのtips
• ソースコードを追う
• まとめ
Anikiとは
YAPC::Hokkaido 2016 Sapporo
https://speakerdeck.com/karupanerura/lai-rigaifalsearuorm-aniki-che-di-jie-shuo
パフォーマンス向上のための
tips
パフォーマンスを阻害するもの
• 実行される回数が多い処理
• 複雑な処理
• 外部要因に依存する処理
実行される回数が多い処理
• ライブラリ機能そのものの呼び出しも含む
• 少なくとも O(n) になる
• 1回で良い処理は1回だけにしたいところ
• とはいえ過度な最適化は可読性を損ねる
複雑な処理
• 一般的に計算量の多い処理
• アルゴリズムやデータ構造を工夫して計算量
を減らそう
• ソフトウェアエンジニアリングの基礎大事
• XSというかCつよい人はメモリアクセスやア
ロケーションの最適化まで考えるとよいやも
外部要因に依存する処理
• I/Oやロックなど
• 慣れていないと見落としがち
• モジュールの動的ロードなども
• ただし、PerlのORMという文脈だと現状では
あまり見る意味がない
Aniki開発時の課題
• 外部ライブラリにがっつり依存することを決
めていた
• 外部ライブラリは計算量がわからない
• インターフェースは同じでも実装は変わる
• よく参照されるメソッドの結果をキャッシュ
したい(キャッシュして良いものは)
SQL::Translator::Schema
• SQL::TranslatorのSchemaクラス
• Schemaのメタオブジェクトとして利用
• get_table/get_fieldsなどが割と遅い
• 独自クラスから移譲しつつキャッシュしよう
• Aniki::Schema 爆誕!
Aniki->setup
• 設定や動作条件の違いを吸収
• 最適化したメソッドをセットアップ
• Schemaのwrapやlast_insert_idなど
• row classなども
$aniki->select
• prepare_cachedがデフォルト
• クエリの順序を標準化
• Aniki::QueryBuilder::Canonical
• キャッシュヒット率向上
• クエリキャッシュにも優しい
実際に
ソースを
みていきましょう
Githubにあります
https://github.com/karupanerura/Aniki
読んでいきましょう
まとめ
まとめ
• Anikiはいろいろ実装工夫してます
• つかってくれるとうれしい

Aniki::Internal