情報量
#圧縮
https://ja.wikipedia.org/wiki/情報量
JavaScriptの例
JavaScriptのコード・deflateによる圧縮で例示する
元のコード
例えば、以下のようなコードが存在するとする:
code:js
gl.texParametri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
gl.texParametri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
手で圧縮
手で圧縮するとこう:
code:js
gl.texParametri(3553,10240,9728);gl.texParametri(3553,10241,9728)
これをdeflateにすると、65 bytes -> 40 bytes になる
mapにする
gl.texParametri の箇所が繰り返しだなあと思い、mapにする:
code:js
10240,10241.map(g=>gl.texParametri(3553,g,9728))
これをdeflateにすると、50 bytes -> 49 bytes
どゆこと
後者には文章の繰り返しがないので小さくならない
前者には、以下のような要素がある
gl.texParametri という関数
関数の叩き方
定数値
セミコロン ; で関数の間を区切る
対して、後者には、以下のような要素がある
配列の使い方
map という配列のメソッド
ラムダ関数の定義の仕方
gl.texParametri という関数
関数の叩き方
定数値
後者のほうが実コードは短いが、その代わり、いろいろなことが起きている
このような繰り返しの処理は、圧縮アルゴリズムにおまかせしたほうが良い場合もある
具体的には、LZ77をはじめとした辞書式符号化を行う際は有利となる可能性が高い
逆に、CrinklerをはじめとしたContext modeling相手には、for文を真面目に書いてしまう方が有利なこともある
また、どのくらいの規模のデータ(コード)を圧縮しようとしているかによっても条件は大きく変わってくる
推測するな、計測せよ