C言語関係掲示板

過去ログ

No.59. 巨大ソースのコンパイルについて


こんにちは、もう1つよろしいでしょうか?

友人が「素数で勝負!」とか言ってきたので今いろいろ試行錯誤して高速化しています。
で、最初は300年かかりそうだったのを20時間程度までなんとか高速化できたんですが、そろ
そろ限界を感じてきました。
そこで、「なんでもあり」とのことだったので、プログラムにすべての素数のテーブルを持た
せてやろうと考えています。
これなら2分で終わるのでボロ勝ちです。

で、テーブルは作成したのですが、あまりに巨大でコンパイルできませんでした。
なんとか実現する方法はないものでしょうか?
コンパイラはVC++かC++Builderです。

↓大体こんな感じのプログラムです。
 mainは同じものを使って、is_prime()の高速化を競っています。
--- main.c ---------------------
#include "prime.h"
int main(void)
{
        unsigned long n = 0;
        do {
                n++;
                if ( is_prime(n) ) {
                        〜
                }
        } while ( n < 4294967295UL );
        return 0;
}
--- prime.h --------------------
int is_prime(unsigned long n);
--- prime.c --------------------
#include "prime.h"
#include "prime_table.h"
static const unsigned long *ptr = prime_table;
int is_prime(unsigned long n)
{
        if ( n == *ptr ) {
                ptr++;
                return 1;
        } else {
                return 0;
        }
}
--- prime_table.h (自動生成) ---
static const unsigned long prime_table[] = {
        2,
        3,
        5,
        〜
        0,
};
--------------------------------


ともじです。随分、すごい勝負をしていますね。

C++Builderを使って、次のテーブルを含むプログラムをコンパイルしましたが、
一応コンパイルは通りました。

static const unsigned long prime_table[4294967295] = {0UL};

けれども、大きさが4294967296になると(当然ですが)通りません。

static const unsigned long prime_table[] = {
        2,
        3,
        5,
        〜
        0,
};

としていますが、大きさは、[4294967295]を超えてはいませんか。


返信ありがとうございます。

> 大きさは、[4294967295]を超えてはいませんか。

これは大丈夫です。
サイズはだいたい200000000くらいです。

もう一度試してみるとエラーが出ていたのはコンパイルではなくリンクでした。(すいません。)
「原因不明のエラー」が出て失敗しています。
リンカがこれほど大きなファイルには対応していないのでしょうか。

しょうがないのでテーブルは別ファイルにしてfopenで開いて処理してみたのですが、
やっぱり随分遅かったです。


> しょうがないのでテーブルは別ファイルにしてfopenで開いて処理してみたのですが、
> やっぱり随分遅かったです。

テキストデータをfscanfで読んでたのを、バイナリデータをfreadで読むように変えてみました。
するとテーブルと単一実行ファイルにしたものとまったく遜色ないくらい速くなりました。
「ファイルへのアクセス==遅い」って先入観があったのですがそんなことないんですね。
勉強になりました。

単一実行ファイルにできなかったのは残念ですけど、速いんでこれでいいことにします。
ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.7
Copyright(c) 2000-2002 TOMOJI All Rights Reserved