プログラムを速くしたい - 逆引き Casio Basic

逆引き Casio Basic
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2015/06/13
[fx-5800P]

頑張って作ったプログラムが思った以上に遅い。これを速くしたい。



プログラム関数電卓 fx-5800P では、作ったプログラムが思った以上に遅くなることがある。最初に作った時は遅いと感じなくても、機能追加をおこなってプログラム規模が大きくなると、目立ってプログラム実行が遅くなることもよくある。

ここで紹介する対策は、fx-5800P 以外の新世代 Casio Basic 搭載のグラフ関数電卓でも使えるが、グラフ関数電卓はそもそもCPUが速い。主に fx-5800P で役立つと思う。

新世代 Casio Basic については、<目次> を参照。

プログラム高速化には、以下を検討すると良い。

・ コマンドや命令の見直し: 実行速度の速い処理に置き換える

・ Goto 削減:
Goto/Lbl をできるだけ使わないようにする

・ 計算式の活用:
条件分岐やループ処理を計算式に置き換える

・ ロジックの見直し:
プログラム全体の構造やロジックを見直す



コマンドや命令の見直し

fx-5800P の Casio Basic は最低必要限のコマンドしか無いが、それでも1つの処理を実現するためには、複数のやりかたがある。ただ、その選択肢が少ないのが特徴で、選択肢が少ないのでプログラムの改善は楽である。

代表的なコマンドや処理の処理時間の一覧をを示す。これは、特定コマンドの厳密な実行時間ではないので、相対的な比較として見て欲しい。

表 fx-5800P Casio Basic 処理時間の比較
処理内容処理時間 (ミリ秒)
A⇒4.1
通常変数アクセス5.4
If A6.2
If A Else7.2
比較演算(変数)9.7
A≠B⇒10.0
論理演算10.0
比較演算(数値)11.5
If A≠B (変数)12.0
if A≠0 (数値)13.7
テキスト表示 (Locate)20.4
配列変数書き込み22.0
配列変数読み出し22.7
リスト読み出し25.1
リスト書き込み25.3
行列読み出し26.9
行列書き込み28.4

1) 配列変数、リスト、行列の使用は極力減らす
 これらは、際だって実行時間が長い。プログラム上完全に無くすことは不可能だが、同じものを繰り返し使うなら、一旦通常変数に代入しておき、それを使えば効果的だ。ロジックを見直して、これらの使用を減らすことも可能なので、検討の余地はあり、とても効果のある方法と言える。

2) 論理演算、比較演算の使用を減らす
論理演算や比較演算は、条件分岐 (If、⇒) やループ (Do, While) の条件判定で使うことが殆どだろう。論理演算子や比較演算子の使用数を減らすように、プログラムを工夫すると良い。同じ演算を繰り返し使用する場合は、大いに改善の余地がある。

3) Baiscコマンドを Dsz、Isz、⇒ に置き換える
Dsz、Isz、⇒ は、古くからの Casio ユーザーの利便性を考えて、現在の Casio Basic でも使えるように配慮されたものだ。特定の条件を満たす場合は、これらの命令を使う方が顕著な高速化が可能になる。

・ If ... Then ... IfEnd (Else が無い) 構文は、に置き換えると30%速くなる。

・ C+1→C は、C が 0 にならないことが保証されるなら、Isz C に置き換える。

・ C-1→C は、C が 0 にならないことが保証されるなら、Dsz C に置き換える。

4) 条件判定で比較演算を使わない
If A≠0、LpWhile A≠0、While A≠0 は、If A、LpWhile A、While A に置き換えるだけで50%の速度向上が見られる。

条件判定は、内部では 0 か 0 でないか、で処理されている。0 の時は偽、0でない時は真、と判定される。そこで、上のように変数を使い、それが 0 か 0でないかで、条件判定ができる。

これの応用として、
If A≠B、LpWhile A≠B、While A≠B は、それぞれ以下のように判定用変数 C を追加した方が遙かに速くなる。

A-B→C
If C:Then
........
IfEnd


Do
........
A-B→C
........
LpWhile C


A-B→C
While C
........
WhileEnd


5) 数値演算は、できるだけ計算式をシンプルにする。
数値演算や関数の処理時間の一例を表に示す。

処理処理時間 (ミリ秒)
乗算 (AxB)1.6
除算 (A÷B)1.8
累乗 (A)1.9
Int(1.23)1.5

数値演算や関数は、相対的に速いことが分かる。しかし、加算を10回行えば、10ミリ秒以上かかるので、これは明かに無駄である。

例えば、
A + (A+1) + (A+2) + ・・・ + (A+10)
を計算する場合、加算 (+) が20回使われる。

そこで、これをシンプルにして
11A+55
とすれば、乗算1回、加算1回だけになり、10倍の速度向上となる。

なお、上の処理速度比較の測定方法や詳細をまとめた記事を紹介しておく;
 ⇒ fx-5800P: 変数アクセス、比較・論理演算、条件分岐の速度比較


Goto 削減
Casio Basic は、プログラムを上から下へ順に読み込みながら実行する、インタープリタタイプの言語だ。
プログラム中 Goto があると、プログラムの最初から最後まで順にスキャンして、ジャンプ先の Lbl や、ジャンプを伴う Basic コマンドを1つひとつ調べる動作が、内部的に行われている。そのため、ジャンプを伴うコマンドが多くなればなるほど、速度は低下する。

従って、やむを得ない場合を除き、Goto を極力使わないことが、高速化の鍵となり、ジャンプを伴うコマンドが多くなるほど、Goto 削減の効果は大きくなる。


計算式の活用
例えば、
A + (A+1) + (A+2) + ・・・ + (A+10) を、

0→I
Do
A+I→A
I+1→I
LpWhile I≦10

とすることができます。実際は、冒頭の式を ループで処理しようとは思わないだろうが、別の処理なら十分有り得る。
このループの代わりに、
11A+55
とした方が圧倒的に速いことに異論は無いだろう。


ロジックの見直し
まずは、プログラムに無駄がないかどうかを調べる。不要な処理が減ればそれだけ速くなるはずだ。
これ以上は、特に一般論はなく、実際のプログラムに即した検討が必要になる。


プログラム高速化の実例



具体的検討の一例として、下記を挙げておく;
 ⇒ Casio Basic入門32 ~ Casio Basic入門37





応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ







keywords: CasioBasic、プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ



関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム関数電卓は、プログラムを作り・使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR