効率化:
プログラミングスタイルに関する問題

プログラムのサイズと速さ

非常に大きく、複雑なパッチを作成した場合、あるいは、1つのメインパッチの中に多くのサブパッチがリンクされている場合、プログラムのサイズと演算の効率が問題になってきます。パッチャーファイルを開いたとき、パッチの中にあるそれぞれのオブジェクトはコンピュータのメモリに読み込まれます。数多くのオブジェクトやサブパッチを含んだ非常に大きなパッチは、かなりの量のメモリを占め、ロード(読み込み)にも長い時間を要する可能性があります。したがって、余分なメッセージやオブジェクトを使わないパッチを作る方法を考えたいと感じることがあるかもしれません。

通常、Max で同じプログラミング課題を達成する方法はいくつかあり、多くの場合、プログラムのサイズやスピードに関しては、そのうちの1つ方法が他の方法に比べてより効率的です。

考慮すべき効率の問題は3つあります。

  1. Max プログラムがロードされる場合のメモリのサイズは、オブジェクト(およびサブパッチ)の数やそれぞれの複雑さによる関数の値になります。

  2. 複雑なMaxプログラムがロードされる時間も、同じ2つの要因による関数の値になります。

  3. プログラムの「リアルタイム」な演算の効率は、あるオブジェクトが演算や通信において他のものより効率的であるという事実によって影響を受けます。

効率化の原則

Max で送信することができるメッセージには非常に多くの種類があるため、オブジェクトが送受信するメッセージの意味を「ルックアップする(該当するものを調べる)」必要がある場合がよくあります。演算速度は、主としてこのメッセージのルックアップ動作を避けることで向上します。接続された2つのオブジェクトのインレットとアウトレットの記述をObject セクションで調べ、それらが同じメッセージ型を共有しているかどうかを確認して下さい。その場合、Max はメッセージの「解釈」を行なわずにすみます。

gateswitchGgateGswitch は右インレットに値が送信されたときにはメッセージをルックアップしません。しかし、これらのオブジェクトは出力するメッセージを常にルックアップします。したがって、整数の場合、特定の数値を探す場合には select== を使うほうがより良い結果になります。


メッセージ・ルックアップは、演算の速さや、グラフィックオブジェクトの再描画処理の時間を決める要因になります

オーバードライブ(Overdrive)モードで実行していない場合、グラフィックオブジェクトは処理を遅くします。これは、スクリーンの再描画に時間がかかるためです。オーバードライブモードで動作している場合には、関連のメッセージルックアップが起こらないため、遅くなることはありません。例えば、ナンバーボックスオブジェクトは数値しか扱わないため、このオブジェクトではメッセージルックアップは生じません

メッセージボックスの出力時には、常にメッセージルックアップが実行されます。したがって、効率を意識したプログラムでは、定数値を生成するためには、オブジェクトボックスに数値を入力する(これによって int オブジェクトが生成されます)ほうがより良い結果をもたらします。もちろん、メッセージボックスはインレットへの様々なメッセージによってトリガできるのに対し、このようなオブジェクトには bang を送信する必要がありますが、そういった変更が可能であれば、メッセージボックスを使用する場合に比べてやや効率が良くなります。 大多数の場合、速度の違いはあまり問題にはなりませんが、このような事例が数多く積み重ねられれば、 注目に値するような効果を得ることができます。

メッセージボックスの同じアウトレットや、様々なメッセージを出力することができるアウトレットを持つ他のオブジェクトから、繰り返し同じメッセージを送信する場合、一般的に、メッセージルックアップは(アウトレット・キャッシングという機能によって)最初にメッセージが送られるときにだけ行なわれます。

MIDI メッセージをチャンネルによってフィルタしたい場合、MIDI を受信するオブジェクトで channel アーギュメントを使う方法は、チャンネルナンバを判定してルーティング情報を出力する方法に比べてより良い結果を得られます。


メモリの使用量、速さのどちらにおいても、Aの方法は最もコンパクトで効率的です。

メモリの使用

かなり大きなプログラムを書いた場合(そして、特にコンピュータのRAMが限られている場合)、そのパッチをロードする(読み込む)ときに使用するメモリの量を減らしておきたいと考えるでしょう。そうすることによって、パッチはより速くロードされます。

サブパッチの中に含まれるすべてのオブジェクトのコピーは、使用されるサブパッチのインスタンスごとに生成されます。そのため、1つのサブパッチの数多くのコピーによって同じようなタスクが行なわれることを避けるようにして下さい。サブパッチを様々な入力値で動作するように設計する方法は、#1 - #9 アーギュメント機能を使って、異なった50個のサブパッチのコピーを作成する方法よりも良い結果を生みます。

スクリーン上に表示されるすべてのボックス1つごとに最低 100 バイトのメモリ・オーバーヘッドが生じますが、閉じられたウィンドウ内にあるボックスではより少ないメモリで済みます。

参照

カプセル化 パッチでどこまで行なうべきか?