Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ULID生成速度を40倍にしたった

 ULID生成速度を40倍にしたった

Transcript

  1. 4 WASMの特徴 • 性能 ‒ ほぼネイティブの速度で実⾏ • 多⾔語対応 ‒ 様々なプログラミング⾔語をサポート

    • クロスプラットフォーム ‒ ブラウザやネイティブのランタイムに対応 • セキュリティ ‒ サンドボックス環境で実⾏ • クロスアーキテクチャ ‒ 複数のCPUアーキテクチャで実⾏(例:ARM、x86)
  2. 8 Aurora MySQLの場合 mysql> SHOW TABLE STATUS LIKE 'users'; +---------+-----------+-

    -+----------------------+- -+ | Name | Engine | | Auto_increment | | +---------+-----------+- -+----------------------+- -+ | users | InnoDB | | 1 | +---------+-----------+- -+----------------------+- -+
  3. 9 Auroraへの連番を使った書き込み AZ1 AZ2 Storage 1 Storage 2 Storage 3

    Storage 4 Storage 5 Storage 6 AZ3 Write Replica ①連番をインクリメント ②最新の連番を取得 ③取得した連番を  使って書き込み
  4. 11 Auroraへのランダムな値を使った書き込み AZ1 AZ2 Storage 1 Storage 2 Storage 3

    Storage 4 Storage 5 Storage 6 AZ3 Write Replica ②⽣成したIDを使って書き込み App ①ランダムな値
  5. 16 連番のリバランシング 4 7 4 5 6 7 8 1

    2 3 4 4 5 1 2 3 • 各ノードは3つまでの値を持つことができるとする • 既存のノードを保ったまま、新しいノードが追加される
  6. 17 ランダムのリバランシング P Z P S T Z A J

    M S S T Z A J P • ページ分割が起きやすくなる • 親ノードの書き換えが起きやすくなる
  7. 18 UUIDの歴史 UUID1 ‒ 太陽暦カレンダーとMACアドレス UUID2 ‒ 太陽暦カレンダーとMACアドレスとPOSIXユーザーID UUID3 ‒

    MD5でハッシュ化されたnamespaceとname UUID4 ‒ 完全ランダム UUID5 ‒ SHA1でハッシュ化されたnamespaceとname UUID6 ‒ ⽇付とMACアドレス UUID7 ‒ UNIXタイムスタンプとランダム UUID8 ‒ バージョン以外は⾃由 最も使われているバージョン 実はソート可能
  8. 19 UUIDv7とULIDのサイズ⽐較 • UUIDv7 • ⽂字列 ‒ 36⽂字 • バイナリ

    ‒ 128バイト • ULID • ⽂字列 ‒ 26⽂字 • バイナリ ‒ 128バイト
  9. 22 ベンチマーク 関数 ulid wa-ulid パフォーマンス倍率 encodeTime 3,612,913 ops/sec 1,466,147

    ops/sec 0.41x decodeTime 2,022,776 ops/sec 4,885,942 ops/sec 2.42x ulid 47,312 ops/sec 454,704 ops/sec 9.61x
  10. 25 const ENCODING: &str = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; // Before let mut

    chars = Vec::with_capacity(len); for index in 0..len { chars.push(ENCODING.chars().nth(index).unwrap()); } // After let mut chars = Vec::with_capacity(len); let encoding_bytes = ENCODING.as_bytes(); for index in 0..len { chars.push(encoding_bytes[index] as char); } 2. 不要な変換やメモリの割り当てを避ける
  11. 26 const ENCODING_LEN: usize = 32; const TIME_LEN: usize =

    10; // Before for i in 0..TIME_LEN { time += i as f64 * (ENCODING_LEN as u64).pow(index as u32) as f64; } // After let powers = [1.0, 32.0, ..., 35184372088832.0] for i in 0..TIME_LEN { time += i as f64 * powers[index]; } 3. 計算結果をキャッシュしておく
  12. 27 ベンチマーク 関数 ulid wa-ulid パフォーマンス倍率 encodeTime 3,863,741 ops/sec 4,904,495

    ops/sec 1.27x decodeTime 1,951,730 ops/sec 5,336,862 ops/sec 2.73x ulid 44,758 ops/sec 1,933,859 ops/sec 43.20x