[AS3] 無名関数のメモリ消費は割と大きい

Posted: 2014-06-09
Category: AS3
Tags: #AS3

現象

  • AS3 で無名関数使うとなんか思った以上にメモリ消費してた
  • Scout などで見ても目に見えて消費量大きい
  • クロージャが変数キャプチャするからだろうけど、それでも思った以上だった

    // これで 798 (byte) とか返ってくる。
    // 普通のクラスのインスタンスで 50 とかなのに
    flash.sampler.getSize(
        function():void {}
    );
    

  • 例えばよく呼ばれるところに何も副作用のない以下のコードを書いただけで、 目に見えてメモリ消費していく

    for (var i:int=0;  i < 100;  ++i) {
        var foo:Function = function():void {};
    }
    

  • このメモリはちゃんと GC で回収されるけど、それは GC を起こしてしまうってことだ

指針

  • 無名関数を使わずに書く、なんてのは現代的ではなくてつらいので避けたい
  • だが実際クロージャ作りたいところをわざわざクラス変数とクラスメソッドを使って書いたりすると、 メモリ消費は下がったりする
  • フレームワークのレイヤーなどでたくさんオブジェクトが作られるようなところでは こういう泥臭い対応をしてもよいかな…

参考リンク