TypedArray と ArrayBuffer って何?どうして必要なの?
ArrayBuffer とは TypedArray とは
ArrayBuffer は固定長の生のバイナリデータ(メモリ領域)そのもの
直接の読み書きは不可能!
view を通してアクセスすることが可能
TypedArray は ArrayBuffer に対する文字通り型付きの view
Uint8Array, Int32Array, Float61Array, ...
特定の型でメモリを解釈する
code:ts
Int8Array // 8bit 符号付き整数(-128 ~ 127)
Uint8Array // 8bit 符号なし整数(0 ~ 255)
Uint8ClampedArray // 8bit クランプ付き(範囲外を0/255に丸める)
Int16Array // 16bit
Uint16Array // 16bit 符号なし
Int32Array // 32bit
Uint32Array // 32bit 符号なし
Float32Array // 32bit 浮動小数点
Float64Array // 64bit 浮動小数点
BigInt64Array // 64bit BigInt
BigUint64Array // 64bit BigInt 符号なし
U prefix は unsigned のことで符号なしのこと
int や float はデータの型
数字は要素のデータサイズのことで、これが大きくなると要素数も少なくなる
なんか雰囲気のイメージだと ArrayBuffer そのものには用がないというか、名前の通り buffer であって、そこでなんらかの場所をバッファしておく
メモリとかアドレスみたいな話になってくるけど ArrayBuffer であらかじめ?指定したバイト数から TypedArray で指定した型に応じてそのバイト数を分割というかしていく
(⬆️雰囲気すぎるので嘘を大含み)
そもそも何が嬉しいの TypedArray の
TypedArray の嬉しさは型が決まった array であるということ、配列長も固定であるということ
そしてバイナリとして連続でメモリに置かれる実在のデータであること
全要素が単一の数値型である(homogeneous)ということが保証されている(TS の 型ではなく JS の)
普通の JS の配列は各要素がオブジェクトとして扱われる(!)
参照を介して値にアクセス
要素ごとに型情報やボックス化(なにそれ)のオーバーヘッドがあるし、メモリも飛び飛びになっている
それに対して TypedArray は連続したメモリでかつバイナリなので速いし効率もいいらしい
昔の JS には バイト列をそのまま持てる入れ物がなかった
ので当時は Array にぶち込んでいた
1 byte なのに要素ごとのオーバーヘッドがかかってメモリが膨らむ
連続した生メモリではなく、GPU やファイル API にそのまま渡すことができなかった
文字列に変換して持つとしても無駄に肥大化
TypedArray は「型を数値に固定して、連続した生メモリ(ArrayBuffer)を直接持つ」という割り切りをしている
また、binary を直接扱うことができるので各種 API の共通通貨になる
fetch
WebSocket
File
Canvas
Web Audio
WebGL
Wasm
いつどうして生まれたのか
2009 ~ 2011 頃に WebGL ができて?、Array(既存の)が遅すぎて話にならなかったそう
ブラウザで先述の Web API を本格的に扱うことになり、バイト列を素直に持てる型が必要になった
#TypeScript TypeScript.icon
JavaScript JavaScript.icon