home > 投稿 > FLASH Lite1.1:擬似配列とメモリコスト
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

メモリ開放もすぐできるしね

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/593

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)