SDCCでは、実数の計算ができるので、BASICで書かれたマンデルブロ集合表示プログラムをSDCCに移植して性能評価を行ってみました。
BASICのプログラムとできるだけ同じ条件で処理時間を比較して比較してみたかったので、プログラムはBASICのそれのべたな書き換えになっています。
SDCCは、実数計算ができるのですが、標準の状態ではprintf()関数にに%fなどの実数値を表示するための書式指定がないため、計算結果を表示できないという問題があります。一方、このマンデルブロ集合表示プログラムは実数の計算値そのものを表示する必要がないので、ある意味SDCCの実数計算機能の確認に使うのにうってつけです。
#include <stdio.h>
#include <stdarg.h>
#define CR '\r'
#define LF '\n'
void (*wexit)() = (void *)0x0083 ;
void (*conout)(char) = (void *)0x008c ;
char (*conin)() = (void *)0x0098 ;
void (*initexectime)() = (void *)0x00C2 ;
int (*getexectime)() = (void *)0x00C5 ;
int putchar(int c)
{
if (c == '\n')
conout('\r') ;
conout(c) ;
return c ;
}
void main()
{
int x, y, i ;
float ca, cb, a, b, t ;
initexectime() ; // 計時開始
for (y = -12 ; y <= 12; y++) {
for (x = -39; x <= 39; x++) {
ca = x * 0.0458 ;
cb = y * 0.08333 ;
a = ca ;
b = cb ;
for (i = 0; i <= 15; i++) {
t = a*a - b*b + ca ;
b = 2 * a * b + cb ;
a = t ;
if ((a * a + b * b) > 4) {
if (i > 9)
i = i + 7 ;
putchar(48+i) ;
goto l180;
}
}
putchar(' ') ;
l180:
}
putchar('\n') ;
}
printf("EXEC TIME: %d sec\n", getexectime()) ; // 計時結果
}
プログラムの最初と最後の部分には、時間を計測するためのモニタルーチンを呼び出すinitexectime(), getexectime()の2つの関数を追加しています。
プログラムの実行時間は、3分34秒(4MHz)でした。
C言語に書き換えても、BASICによる実行時間には勝っているものの、処理時間に大きな違いがないように見えます。
これは、プログラムの実行制御にかかる時間に比べ、実数の計算時間の方が支配的であるか、SDCCの実数演算機能がBASICのそれに比べて性能が低いことが示唆されています。
もっと早くなると思ったのですが残念。