Tips

配列処理の最適化

日付2006/09/18
ID06-007
バージョン2004
プラットフォームMac & Win

配列全体を解析し、不要な値の要素を消去したい場合、どうすればよいでしょうか。もっとも自然に頭に浮かぶ解決手段は、配列全体を解析し、不要な値を検出したらDELETE ELEMENTコマンドでその要素を消去するというものかもしれません。

たとえば、10000要素の倍長整数配列があり、値が3の倍数ではない要素は消去するとします。

基本のメソッドは次のようなものになります:



テキスト形式

このメソッドの問題は、メモリの解放が何度も発生しているという点です。配列の要素を消去するたびにメモリが解放されており、それには処理時間が必要です。

別の解決手段としては、「有効な」値のリファレンス、つまり前述の例では3の倍数を代入する要素のリファレンスを使用するという方法があります。このリファレンスは、オリジナルと同じ配列を指し、要素番号0からスタートして有効な値を保存するたびに値が増えてゆきます。

有効な値と消去する値を判別する方法は、前のメソッドと変わりません。最適化されたほうのメソッドでは、ループの中で不要な要素を消去せずに有効な値で上書きしている点が異なっています。値の上書きは瞬時であり、メモリの解放は発生しません。

ループの最後に、無用な要素(リファンレンスが指している要素よりも後の要素)は、まとめて消去しています。このようにすれば、メモリの解放は一度だけで済みます。

最適化されたほうのメソッドは次のようになります:



テキスト形式

最適化によって著しいパフォーマンスの向上が得られます。

インタプリタモードでは、1番目のメソッドを完了するのには506ミリ秒、2番目のメソッドを完了するのには74ミリ秒かかりました。それほど悪くない数字です。

コンパイルモードでは、1番目のメソッドを完了するのに要した時間は333ミリ秒、2番目のメソッドは...何と1ミリ秒で完了しました。