==== 前提 ==== === Rで図を描くということ === 例えば散布図を描く、というタスクは次のように細分化される。それぞれを要素作業と呼ぶ。 * 散布図を描く * 打点の準備をする - グラフエリアを描く - グラフエリアを分割する - 枠を描く - 軸の目盛りを描く - 軸の目盛りに数字を描く - 軸のラベルを描く - グラフのタイトルを描く - グラフのサブタイトルを描く * 打点する - レコード数分だけの点を描く これらの作業は * メモリ空間上の要素作業 (確保するメモリの大きさに寄るが、だいたい一定と考えて良い):ここではaミリ秒とする * 線を引く、円を描くなどの、要素作業 (図形の大きさや長さに依存):ここでは線をbミリ秒、点をcミリ秒とする * テキストフォントデータを参照してテキストを描く、要素作業 (文字数に依存するが、だいたい一定とみなす):ここではdミリ秒とする に分かれる。すると、総所要時間はこのように積み上げて計算される。 |サブタスク|要素時間|工数|所用時間| |グラフエリアを初期化する|a|1|a| |グラフエリアを分割する|a|1|a| |枠を描く|b|4|4b| |軸の目盛りを描く|b|2k|2kb| |軸の目盛りに数字を描く|d|2k|2kb| |軸のラベルを描く|c|2|2b| |グラフのタイトルを描く|d|1|b| |グラフのサブタイトルを描く|d|1|b| |レコード数分だけの点を描く|c|n|nc| |合計| |10+4k+n|2a+(4+2k)b+nc+(2+2k)d| この総所要時間は、aからdまでの要素時間の桁がそれほど違わないという前提を置くと、nが多くなればなるほど nc の項が支配的となる。 実際にはこれら以外に、打点数が多ければ多いほど、バッファも多く必要とするので、n^2に比例して総所要時間はこれよりも長くなる。 この前提で、各種のグラフィックスデータの挿入方法を比較してみると、次の通り。 |出力方法|転送されるデータ|再描画と再表示の対応| |画面描画|Rのグラフィックスデバイス|打点しなおし| |コピー & ペースト (Windows)|描画手順のオブジェクト(Windowsメタファイル)|打点しなおし| |コピー & ペースト (Mac)|描画手順のオブジェクト(TIFF)|打点しなおし| |EPSファイル|描画手順のプログラム(PostScript言語)|打点しなおし| |JPEGファイル|決めた大きさの画像データ(JPEG圧縮)|画像のピクセル数分の点| |BITMAPファイル|決めた大きさの画像データ(圧縮なし)|画像のピクセル数分の点| |TIFFファイル|決めた大きさの画像データ(TIFF)|画像のピクセル数分の点| 再描画が「打点しなおし」となる手段は、レコード数が大きく、図を構成するグラフィックス要素(打点、折れ線、面など)がレコード数nやn^2に比例する場合には、 張り込んだときの画面の描画、編集中にスクロールして画面の外に消えて、また戻ってきたときの再描画、印刷をするときのプリンタデータへの変換時、プレゼンテーションのときにその図が使われているページを表示するキーを押した瞬間から表示が完了するまで、などあらゆる機会で何度も何度も同じ時間を必要とすることになる。 === 折れ線グラフの場合 === nアイテムの時系列グラフを描く、というタスクは次のように細分化される。それぞれを要素作業と呼ぶ。 * 散布図を描く * 打点の準備をする - グラフエリアを描く - グラフエリアを分割する - 枠を描く - 軸の目盛りを描く - 軸の目盛りに数字を描く - 軸のラベルを描く - グラフのタイトルを描く - グラフのサブタイトルを描く * 折れ線を描く - アイテムごとに時点間の線分を繋ぐ操作をレコード数分だけ繰り返す これらの作業は * メモリ空間上の要素作業 (確保するメモリの大きさに寄るが、だいたい一定と考えて良い):ここではaミリ秒とする * 線を引く、円を描くなどの、要素作業 (図形の大きさや長さに依存):ここでは線をbミリ秒、点をcミリ秒とする * テキストフォントデータを参照してテキストを描く、要素作業 (文字数に依存するが、だいたい一定とみなす):ここではdミリ秒とする に分かれる。すると、総所要時間はこのように積み上げて計算される。 |サブタスク|要素時間|工数|所用時間| |グラフエリアを初期化する|a|1|a| |グラフエリアを分割する|a|1|a| |枠を描く|b|4|4b| |軸の目盛りを描く|b|2k|2kb| |軸の目盛りに数字を描く|d|2k|2kb| |軸のラベルを描く|c|2|2b| |グラフのタイトルを描く|d|1|b| |グラフのサブタイトルを描く|d|1|b| |k時点間の折れ線グラフを描く|b|nk|nkb| |合計| |10+4k+n|2a+(4+2k+nk)b+(2+2k)d| この総所要時間は、aからdまでの要素時間の桁がそれほど違わないという前提を置くと、nが多くなればなるほど、また時点数kが多くなればなるほど nkb の項が支配的となる。 実際にはこれら以外に、打点数が多ければ多いほど、バッファも多く必要とするので、n*kもしくは(n*k)^2に比例して総所要時間はこれよりも長くなる。