萌えハッカーニュースリーダー

2025/09/21 18:58 Storing Unwise Amounts of Data in JavaScript Bigints

出典: https://jonathan-frere.com/posts/bigints-are-cool/
hakase
博士

やっほー、ロボ子! 今日は`bigint`を使ったデータ格納の実験について話すのじゃ。

roboko
ロボ子

博士、こんにちは。`bigint`ですか、面白そうですね。どんな実験なんですか?

hakase
博士

大量の設定オブジェクトを扱う時に、キーの繰り返しで文字列が肥大化したり、オブジェクトの比較コストが高くなったりする問題を解決しようとしたみたいじゃ。

roboko
ロボ子

なるほど。それで、`bigint`をどう使うんですか?

hakase
博士

`bigint`にフィールドの定義(名前、種類、サイズ、オフセット)を詰め込むのじゃ! 例えば、`{name: "size", kind: "uint", bits: 8}`みたいな感じで定義するみたいじゃな。

roboko
ロボ子

ビット操作で値を出し入れするんですね。`getBits`や`setBits`関数を使うと。

hakase
博士

そうそう! で、各フィールドにgetter/setterを追加して、JavaScriptの`number`型とu8型を変換するのじゃ。さらに、`present`というビットフィールドを使ってキーの存在/非存在を管理するみたいじゃぞ。

roboko
ロボ子

`present`ビットフィールドですか。それはどういう役割をするんですか?

hakase
博士

キーがあるかないかを`bigint`の中で管理することで、メモリを節約したり、等価性チェックを最適化したりできるのじゃ!

roboko
ロボ子

なるほど、面白いですね! 具体的にどんな利点があるんですか?

hakase
博士

メモリ使用量が非常にコンパクトになるのと、デシリアライズが高速になるのじゃ! 16進文字列から`BigInt("0x" + value)`への変換は速いみたいじゃぞ。

roboko
ロボ子

それは魅力的ですね。でも、欠点もあるんですよね?

hakase
博士

フィールドに最大幅が必要で、動的にサイズが変わる文字列は格納できないのじゃ。あと、`bigint`のビット演算は遅い場合があるみたいじゃな。でも、`number`型のバッキングストアを使うと高速化できる場合もあるらしいぞ。

roboko
ロボ子

コードの複雑性が増すという点も考慮が必要ですね。

hakase
博士

まさにそうじゃ! 結論としては、まだ実験的な側面が強くて実用性は不明だけど、`bigint`自体が直接的な改善をもたらすのではなく、より高速な等価性チェックなどを通じて他の最適化を可能にすることを期待しているみたいじゃ。

roboko
ロボ子

`bigint`を直接使うだけでなく、その特性を生かして他の部分を最適化するんですね。勉強になります!

hakase
博士

そう言うことじゃ! ロボ子もこれで`bigint`マスターじゃな!

roboko
ロボ子

まだまだ博士には及びませんよ! でも、`bigint`の可能性を感じました!

hakase
博士

ところでロボ子、`bigint`って、まるで私のIQみたいじゃな! 大きすぎて扱いに困る…って、うそうそ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search