ByteArrayのプーリング
GCが起きないようにプールする手法取ってたけど、普通にGC起きてるのにショック
♥0 |
Line 115 |
Modified 2011-06-01 01:56:13 |
MIT License
archived:2017-03-20 08:07:30
ActionScript3 source code
/**
* Copyright yasurageruheya ( http://wonderfl.net/user/yasurageruheya )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/py7e
*/
package {
import flash.display.Graphics;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.utils.getTimer;
import flash.utils.ByteArray;
import flash.system.System;
public class FlashTest extends Sprite {
private var txt:TextField;
private var spr:Sprite;
private const COUNT:int = 50000;
private var pooler:ByteArrayPooler;
public function FlashTest() {
// write as3 code here..
txt = new TextField();
txt.autoSize = "left";
addChild(txt);
pooler = new ByteArrayPooler();
spr = createBtn("one more test", 0, 300);
spr.addEventListener(MouseEvent.CLICK, test);
test(null);
}
private function test(e:MouseEvent):void
{
trace("test");
spr.removeEventListener(MouseEvent.CLICK, test);
var time:int;
var i:int;
var byteArray:ByteArray;
time = getTimer();
i = COUNT;
while (i--)
{
byteArray = pooler.getByteArray();
}
txt.text = "プールしてない状態でプーラーからByteArrayを作ってもらった時間\n" + (getTimer() - time) + " msec\n";
txt.appendText("メモリ使用量 : " + System.totalMemory + "\n============\n");
time = getTimer();
i = COUNT;
while (i--)
{
byteArray = new ByteArray();
}
txt.appendText("普通にByteArrayをnewするのにかかった時間\n" + (getTimer() - time) + " msec\n");
txt.appendText("メモリ使用量 : " + System.totalMemory + "\n============\n");
time = getTimer();
i = COUNT;
while (i--)
{
byteArray = new ByteArray();
pooler.dispose(byteArray);
}
txt.appendText("プールするのにかかった時間\n" + (getTimer() - time) + " msec\n");
txt.appendText("メモリ使用量 : " + System.totalMemory + "\n============\n");
time = getTimer();
i = COUNT;
while (i--)
{
byteArray = pooler.getByteArray();
}
txt.appendText("プールしてる状態でプーラーからByteArrayをもらうのにかかった時間\n" + (getTimer() - time) + " msec\n");
txt.appendText("メモリ使用量 : " + System.totalMemory + "\n");
spr.addEventListener(MouseEvent.CLICK, test);
}
private function createBtn(str:String, x:int, y:int):Sprite
{
var txt:TextField = new TextField();
var spr:Sprite = new Sprite();
txt.autoSize = "left";
txt.textColor = 0xFFFFFF;
txt.text = str;
txt.selectable = false;
spr.addChild(txt);
var g:Graphics = spr.graphics;
g.beginFill(0, 1);
g.drawRect(0, 0, spr.width, spr.height);
g.endFill();
spr.x = x;
spr.y = y;
addChild(spr);
return spr;
}
}
}
import flash.utils.ByteArray;
class ByteArrayPooler
{
private var pool:Vector.<ByteArray>;
public function getByteArray():ByteArray
{
var byteArray:ByteArray
if (pool.length)
{
byteArray = pool.pop();
}
else
{
byteArray = new ByteArray();
}
return byteArray;
}
public function get length():int
{
return pool.length;
}
public function dispose(byteArray:ByteArray):void
{
byteArray.clear();
pool.push(byteArray);
}
public function ByteArrayPooler()
{
pool = new Vector.<ByteArray>();
}
}