2013年6月1日土曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第7章(入出力)、7.8(雑関数)、7.8.2(文字クラスのテストと変換)演習7-9を解いてみる。

その他参考書籍

演習 7-9.

スペースを節約する形。

コード

sample.c

#include <stdio.h>

int isupper(char);

int main(int argc, char *argv[])
{
    int c, i, n;
    
    n = 5000000;
    while ((c = getchar()) != EOF) {
        for (i = 0; i < n; i++)
            isupper(c);
    }
    return 0;
}

int isupper(char c)
{
    return 'A' <= c && c <= 'Z' ? 1 : 0;
}

入出力結果(Terminal)

$ du a.out
24 a.out
$ time ./a.out < sample.txt

real 0m23.477s
user 0m22.365s
sys 0m0.086s
$

実行時間を短くする形。

コード

sample.c

#include <stdio.h>
#define isupper(c) ('A' <= (c) && (c) <= 'Z') ? 1 : 0

int main(int argc, char *argv[])
{
    int c, i, n;
    
    n = 5000000;
    while ((c = getchar()) != EOF) {
        for (i = 0; i < n; i++)
            isupper(c);
    }
    return 0;
}

入出力結果(Terminal)

$ du a.out
24 a.out
$ time ./a.out < sample.txt

real 0m17.678s
user 0m16.697s
sys 0m0.070s
$
real 0m7.080s
user 0m6.676s
sys 0m0.028s
$

Cのプリプロセッサを使った方が、実行速度が速くなったのは確認できたけど、Cのプリプロセッサを使わず関数を定義した場合にスペースが節約できたかどうかはどう確認すればいいのかなぁ〜コンパイルして出来上がったファイルのサイズが異なるかと思ったけど、どちらも24と同じサイズに。。(前者がスペースの節約になると考えた理由は、Cのプリプロセッサで定義した場合はisupperが呼び出される都度、Cのプリプロセッサで定義した内容が展開されると考えたから。)

0 コメント:

コメントを投稿