2009/08/11
FLASH Lite1.1:擬似配列とメモリコスト
400個のMCを並べるものを書いていたんですが、
MCの中に変数一個追加しただけで100KB近く増えるので調査した。
for(i=0;i<100;i++){
eval("myArray" add i) = 100;
}
| 190KB |
for(i=0;i<1000;i++){
eval("myArray" add i) = 100;
}
| 421KB |
for(i=0;i<10000;i++){
eval("myArray" add i) = 100;
}
| 2811KB |
for(i=0;i<100000;i++){
eval("myArray" add i) = 100;
}
| メモリエラー |
↓
trace((2811-421)/(10000-1000))
//0.265555555555556
trace((2811-190)/(10000-100))
//0.264747474747475
trace((421-190)/(1000-100))
//0.256666666666667
1変数あたりのコストは、257Byte ~ 266Byte
intのつもりでもデータ部分に 256Byte 変数名テーブル内に数Byteの割り当てな感じ。
先に書いた400個のMCだと、256Byte*400 = 100KB で推定できる。
ちなみに
for(i=0;i<10000;i++){
eval("m" add i) = 100;
}
| 2059KB |
for(i=0;i<10000;i++){
eval("myA" add i) = 100;
}
| 2651KB |
for(i=0;i<10000;i++){
eval("myAr" add i) = 100;
}
| 2811KB |
for(i=0;i<10000;i++){
eval("myArray" add i) = 100;
}
| 2811KB |
for(i=0;i<10000;i++){
eval("myArrayArray" add i) = 100;
}
| 3068KB |
きれいに比例じゃないっぽいけど、変数名はメモリ上で管理されているので
eval使って配列するときなんかは変数名は長すぎないほうがいい
for(i=0;i<10000;i++){
eval("myArray" add i) = 100;
}
| 2811KB |
//Stringもいっしょ
for(i=0;i<10000;i++){
eval("myArray" add i) = "100";
}
| 2811KB |
//キャストできるわけではない
for(i=0;i<10000;i++){
eval("myArray" add i) = int(100);
}
| 2811KB |
とりあえず確認。型をあいまいに解釈してるのでメモリは変わらない。
で、常識的に考えるとそんなにでっかいデータを入れることもないので、
↓とかの方のがいいと思われる。
myArray = ""
for(i=0;i<100;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,100,1)));
| 170KB |
myArray = ""
for(i=0;i<1000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,1000,1)));
| 171KB |
myArray = ""
for(i=0;i<10000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,10000,1)));
| 180KB |
myArray = ""
for(i=0;i<50000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,50000,1)));
| 219KB |
myArray = ""
for(i=0;i<100000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,100000,1)));
| メモリエラー |
きれいに1バイトづつ増えてますね。
これで湯水のようにメモリが使えるようになります。
ただ、chr → ord で戻すと上位1ビットがうまく扱えないらしく、
1~128までの整数しか入らない。工夫すればなんとかなりそうだけど。
※2文字づつ格納で16384、3文字づつ格納で2097152まで。
myArray = ""
for(i=0;i<10000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,10000,1)));
| 180KB |
myArray = ""
for(i=0;i<10000;i++){
myArray = myArray add chr(100);
}
trace(ord(substring(myArray,10000,1)));
myArray = ""
| 169KB |
メモリ開放もすぐできるしね