C言語版を以下のように書き直して、perl と速度比較してみる。
統合環境でコンパイル 32bit版
→ 110秒
コマンドラインでコンパイル 64bit版 /Ot /arch:AVX2 /GL
→ 62秒
Perl スクリプト
→ 130秒
64bit の威力!
C言語だとメモリ 3GB 手前ぐらいで 2999999929 まで求められました。
#include "stdafx.h"
#include <stdlib.h>
#include <stdbool.h>
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long long int prime_max = 100000000;
bool *prime;
unsigned long long int i, j;
/* 配列の領域を確保 & 初期化 */
prime = (bool *)malloc(sizeof(bool) * (prime_max + 1));
for (unsigned long long i = 0; i <= prime_max; ++i)
prime[i] = true;
/* さて、始めるよ! */
for (i = 2; i <= prime_max/2 ; ++i){
if (!prime[i])
continue; /* 素数で無いなら次へ */
/* 素数の倍数 (=素数で無い) に false を代入 */
for (j = 2; prime_max >= i * j; ++j)
prime[i*j] = false;
}
return 0;
}
#include <stdlib.h>
#include <stdbool.h>
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long long int prime_max = 100000000;
bool *prime;
unsigned long long int i, j;
/* 配列の領域を確保 & 初期化 */
prime = (bool *)malloc(sizeof(bool) * (prime_max + 1));
for (unsigned long long i = 0; i <= prime_max; ++i)
prime[i] = true;
/* さて、始めるよ! */
for (i = 2; i <= prime_max/2 ; ++i){
if (!prime[i])
continue; /* 素数で無いなら次へ */
/* 素数の倍数 (=素数で無い) に false を代入 */
for (j = 2; prime_max >= i * j; ++j)
prime[i*j] = false;
}
return 0;
}
# perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
# エラトステネスの篩 (Sieve of Eratosthenes)
my $MAX = 10000000;
my $results = timethese( 1,{
Erat_pl =>
sub {
my $x = $MAX;
my @Prime = ();
for (my $i = 2 ; $i <= sqrt($x) ; $i++){
# マークが付いていたら (=素数でなかったら) 次へ
if (defined($Prime[$i])){next;}
# 素数の倍数にマークを付ける
for (my $j = 2 ; $x >= ($i * $j) ; ++$j ){
$Prime[$i * $j] = 1;
}
}
},
Erat_clx64 =>
sub {
system('C:/~~~/Eratosthenes_cl.exe');
},
Erat_IDEx86 =>
sub {
system('C:/~~~/Eratosthenes_IDE.exe');
}
});
cmpthese $results;
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;
# エラトステネスの篩 (Sieve of Eratosthenes)
my $MAX = 10000000;
my $results = timethese( 1,{
Erat_pl =>
sub {
my $x = $MAX;
my @Prime = ();
for (my $i = 2 ; $i <= sqrt($x) ; $i++){
# マークが付いていたら (=素数でなかったら) 次へ
if (defined($Prime[$i])){next;}
# 素数の倍数にマークを付ける
for (my $j = 2 ; $x >= ($i * $j) ; ++$j ){
$Prime[$i * $j] = 1;
}
}
},
Erat_clx64 =>
sub {
system('C:/~~~/Eratosthenes_cl.exe');
},
Erat_IDEx86 =>
sub {
system('C:/~~~/Eratosthenes_IDE.exe');
}
});
cmpthese $results;
統合環境でコンパイル 32bit版
→ 110秒
コマンドラインでコンパイル 64bit版 /Ot /arch:AVX2 /GL
→ 62秒
Perl スクリプト
→ 130秒
64bit の威力!
C言語だとメモリ 3GB 手前ぐらいで 2999999929 まで求められました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます