目次

高速化

 マクロを利用して、定形処理を自動化すると
 時間を有効に使えるようになります。

 より時間を有効利用するためには、マクロが
 動いている時間を短くし、高速化を考えたい
 もの。

 マクロを記述するときには、ObjectやApplicationと
 いう便利な指定を少なくしていけば、マクロの動作
 時間が短くなります。

 1回しか呼び出さないマクロであれば、1msだろうと
 100msだろうと、ユーザーには一瞬で差異を認識不能
 ですが、繰り返しでその回数が多くなれば、多くなる
 ほど、所要時間が増えていきます。

 便利な記述には、それなりの裏がありますから
 マクロの動作時間を短くするために、作成者は
 工夫を重ねないと、いけません。

 自分がやって効果があった内容は、以下。

 個別で、何故効果があるのかをコメントします。

 変数は、宣言してから利用

  BASICの仕様では、すべての変数はグローバルでしたが
  spreadsheetで使われるBASICでは、スタックを利用する
  ため、メモリを効率よく使う仕様になってます。

  グローバルで変数を確保すると、利用しているコンピュータで
  扱えるビット数(32ビットとか64ビットとか)で確保。

  サブルーチンやプロシージャで、宣言なしで変数を使うと
  メモリ上に、その変数を確保するために、使われていない
  領域を確保するため、不足するとディスクの中に一時的に
  退避し、領域を使い終わると、復帰。

  算盤で指を使って計算する時間と、頭の中で暗算で計算する
  時間の違いと同じで、コンピュータが使えるメモリだけ賄う
  場合と記憶のために紙に書き出す場合では、所要時間に違い
  があります。

  変数を宣言してから利用すると、メモリだけで賄うように
  動くので、一時退避と復帰に必要な時間が不要になり所要
  時間が短縮されます。

 なるべく、自前で計算しない

  マクロを定義して利用することを覚えると、自前で
  関数やプロシージャを作ろうと考えるようになります。

  spreadsheetに用意されている関数やプロシージャは
  アセンブリ言語で記述されていることが多く、最高
  スピードで動くことが可能。また、最適化されている
  ことが多く、高速処理ができます。

  マクロを定義する場合、組み込まれている関数や
  プロシージャを使えるように導くように記述して
  いけばよいと言えます。

  例で説明すると、以下。

   1からNまでの値を加算した結果を求めるときには
   公式 N(N+1)/2 を使えばよいです。
   2からNまでの値を加算した結果を求めるには
   見方を少し変えて 1+2+...+N = N(N+1)/2 に -1 を
   加えて 2+...+N = -1 + ( N(N+1)/2 ) にすればよい。

  FOR文やWHILE文でループを回して計算するよりも
  乗算と減算を適用する方が、結果を求めるまでの
  時間が短くなるなら、それで処理する方がよいと
  判断します。

   N(N+1)/2 の分子にある N と (N+1) はどちらかが
  必ず偶数になり、2の倍数になるため、除算を右に
  シフトしての対応が可能。

  繰返し減算による除算よりも、高速に処理できると
  理解できるとわかります。このような工夫を加える
  ことができると、マクロを定義したとしても、実行
  速度に違いがでると理解できると思います。

 便利なObjectやApplicationは、独自プロシージャで書換え

  spreadsheetには、ユーザーが操作を簡単にできるように
  ObjectやApplicationと呼ぶ、クラスインスタンスが用意
  されています。

  やりたいことを見極めて、クラスインスタンスを
  使わないでも実現できるなら、そっちを採用した
  方が、内部で余計な判定や計算を含めない分だけ
  処理時間が短くなります。

  判定処理は思いのほか時間がかかるので、判定が
  必要なくなるように、セルを複数使って、単純な
  計算が順次実行されるように工夫します。


目次

inserted by FC2 system