標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第572回]

●遅かったのはcprintf()でした

今回は前回の終わりのところで書きました、RS232C受信時のデータの欠落についての顛末を書く予定だったのですが、ちょっと気になったことがありまして、念の為に確認をしてみましたら、またまた意外なことがわかってしまいましたので、そちらのほうのお話をすることにいたします。

前回は、とにかく画面表示がやたら遅い、ということで、cprintf()をputc()に変更してみましたところ、画面表示が速くなりました、ということを書きました。
確かに速くはなったのですけれど…。

putc()に変えてみても、それでもなんだかやっぱり画面表示に時間がかかっているようなのですねえ。

じつは、ネットでいろいろ検索をした結果、printf()は実行に時間がかかるが、putc()なら速い、という説明記事をみつけまして、そーか、そーか、そーいうことだったのか、
とガッテンしまして、さっそくputc()を使ってみましたところ、確かに表示速度が上がりましたので、それで前回の記事になったのです。

ですけれど、やっぱりものごとは自分で確かめてみなければいけません。
果たして本当にprintf()はputc()よりもそれほどに遅いのか?

で、試してみることにいたしました。
まずはputc()です。

//putc test
//10/8/3
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
//
void main()
{
        int c;
        unsigned int i;
        char wkbf[5]="\0";
        clock_t start,end;
        start = clock();
        for(c=0;c<1000;c++)
                {
                sprintf(wkbf,"%d",c);
                for(i=0;i<strlen(wkbf);i++)putc(wkbf[i],stdout);
		putc('\n',stdout);
		}
	end = clock();
  	printf("%dmsec\n",end-start);
}

printf()は書式が使えますがputc()はそういうわけにはいきません。
数値データを文字列に変換しておいてから、その文字列を出力します。
1000個のデータを出力するのにかかった時間は104msecでした。

次はprintf()です。

//printf test
//10/8/3
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
//
void main()
{
        int c;
        unsigned int i;
        char wkbf[5]="\0";
        clock_t start,end;
        start = clock();
        for(c=0;c<1000;c++)
                {
                sprintf(wkbf,"%d",c);
                for(i=0;i<strlen(wkbf);i++)printf("%c",wkbf[i]);
		printf("\n");
		}
	end = clock();
  	printf("%dmsec\n",end-start);
}

さきほども書きましたように、printf()は書式が使えますから、printf(”%d¥n”,c);と書けば、それだけで済んでしまうのですが、それでは比較になりませんから、上のプログラムのようにしました。
こちらの実行時間は110msecでした。
確かにputc()の方がほんのちょっとだけ速いのですけれど、でも極端に差が有る、というほどではありません。

念の為に、改行しないでベタに表示させてみました。
putc()のプログラムもprintf()のプログラムも”¥n”を出力している行を下のようにコメントに変えて実行してみました。

	// putc('\n',stdout);

	//printf("\n");

その結果は予想に反して、改行有りのプログラムよりも遅くなってしまいました。
putc()の方は108msecとそれほど遅くはならなかったのですが、printf()の方は146msecとかなり遅くなりました。
改行有りよりも遅くなってしまうのは、スクロール表示になにか関係がありそうです。

それにしてもこのテストの結果からは、printf()がputc()に比べて、目立って遅い、というほどではない、ということが言えそうです。

おお。
そうでした。
じつは、もともとのプログラムでは、文字を緑色で着色して表示するために、printf()の代わりにcprintf()を使っています。
前回はそのことにもちょっと触れて、「cprintf()とprintf()は同じ」と書きました。

でも、せっかくここまでテストしたことですから、念の為にcprintf()についても試してみなくては。

printf()をcprintf()に直すだけですから簡単です。
おっと。cprintf()は改行の書式がprintf()と異なります。
cprintf(”¥r¥n”);としなければいけません。
ですから下のように変更します。

		for(i=0;i<strlen(wkbf);i++)cprintf("%c",wkbf[i]);
		cprintf("\r\n");

実行の結果は驚くべきものでした。
おおお。
遅いっ!
なんと、67390msecもかかりました。

そして、cprintf()の場合には改行無しの方が速くなって、7739msecでした。

これなら、確かに、cprintf()をputc()にすることで、画面表示速度が上がる、ということに、文句無く納得できました。

いやあ。
やっぱり確認してみることが大切です。
2010.8.3upload

前へ
次へ
ホームページトップへ戻る