Adobe Flash非公式テクニカルノート オブジェクトを使い回す
[ヘルプ]の[Flash Platformのパフォーマンスの最適化]/[メモリの節約]/[オブジェクトの再利用]には「可能な場合は、同じオブジェクトを繰り返し作成する代わりに再利用」することが勧められています。本ノートではこのお題について考えてみます。 01 なぜオブジェクトを使い回すとよいのか
第1に、新たにインスタンスをつくるより、すでにあるオブジェクトを初期化したり、設定し直す方が基本的には速いです。第2に、前のオブジェクトを捨てて(たとえば変数を上書きして)新たなインスタンスをつくると、要らなくなったオブジェクトは「ガベージコレクション」により片づけられます[*1]。ところが、ガベージコレクションは重い処理なので、すぐには働きません。すると、繰返し処理が多ければ、大量の不要なオブジェクトがガベージコレクションを待つ間メモリに残ることになります。オブジェクトを使い回せば、このガベージコレクションの手を煩わせずに済みます。 つまり、オブジェクトを使い回すと処理が速くなり、CPUやメモリを無駄に費やすことがなくなるのです。そこで、いくつかのクラスのオブジェクトを例にして、使い回し方をご紹介します。
02 オブジェクトのプロパティを設定し直す たとえば、矩形領域を定めるRectangleクラスのコンストラクタメソッドには、4つの引数が渡せます。Rectangleインスタンスを新たにつくるときと、オブジェクトを使い回す場合はつぎのようになります。
ふたつの処理の速さを比べるために、wonderflにテスト用のコードを上げました(wonderfl 001)。 wonderfl 001■Rectangleオブジェクトの新規作成と再利用の比較Recycling vs Creating objects - wonderfl build flash online 03 オブジェクトをメソッドで初期化して使い回す たとえば、MatrixクラスにはMatrix.identity()メソッドがあります[*2]。Matrixオブジェクトに対してこのメソッドを呼出せば、引数なしのコンストラクタメソッドでつくるのと同じデフォルト(単位行列)のインスタンスになります。Matrixオブジェクトを初期化して使い回すのはとても簡単です。
もちろん、Matrix.identity()メソッドの方が、コンストラクタメソッドを呼出すより速いです。ふたつの処理の速さを、wonderflのテスト用のコードで比べてみました(wonderfl 002)。 wonderfl 002■Matrixオブジェクトの新規作成とメソッドによる初期化の比較Recycling vs Creating objects 2 - wonderfl build flash online
04 配列やVectorオブジェクトを空にして使い回す
なお、「配列を初期化するには」Arrayクラスのコンストラクタメソッドを呼出すより、配列アクセス演算子[]を使った方が速いです。コンストラクタメソッドを使う場合も含めて、新たな配列の作成と使い回しの速さをwonderflのテスト用コードで比べました(wonderfl 003)。念のため、Vectorクラスもforkしてテストしました。 wonderfl 003■配列の新規作成とArray.lengthプロパティによる初期化の比較Initializing Arrays - wonderfl build flash online 作成者: 野中文雄 Copyright © 2001-2011 Fumio Nonaka. All rights reserved. |
|||||||