アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

素数を数えて落ち着くんだ

バッチが思った以上に時間が掛かってハラハラドキドキした経験はないですか?
そんな時は素数を数えて落ち着きましょう。

みなさんmonoプロジェクトはご存知でしょうか?

UNIXLinuxMacC#を動かしちゃおうと言うプロジェクトなんですが、
今回はmono(2.6.4)でコンパイル、実行したPGとVC#でコンパイルしたPGでどれぐらい実行速度が変わるか計測してみます。

計測方法は同じスペックのPCを使ってLinuxWindowsで違いを測って見たかったのですが、いろいろ大人の事情ってやつで、Windows 版monoをインストールし、交互に実行時間を計測します。

1、まずコードを書きます。
1〜1000000の間で素数を求めるプログラムを書きます。
実行時間を計るためにSystem.Diagnosticsusing.Stopwatchを使ったのですが、monoでコンパイルエラーになったのでコメントアウトしました。
時間計測はbatファイルで行います。



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(string[] args)
        {

            //Stopwatch sw = new Stopwatch();

            //sw.Start();

            const int max = 1000000;
            bool[] prime = new bool[max];
            prime[0] = false;
            prime[1] = false;
            int count = 0;

            for (int i = 2; i < max; i++){
                prime[i] = true;
            }
            for (int i = 2; (i * i) < max; i++){
                if (prime[i] == true){
                    for (int y = (i << 1); y < max; y += i){
                        if (prime[y] == true){
                            prime[y] = false;
                            count++;
                        }
                    }
                }
            }
            for (int i = 2; i < max; i++){
                if (prime[i] == true)
                    Console.WriteLine(i);
            }

            //sw.Stop();

            //long millisec = sw.ElapsedMilliseconds;

            //Console.WriteLine(millisec);



        }


    }
}



2、コンパイルします。
VC#はMicrosoft Visual Studio 2008 Expressでビルドを行いました。
monoのコンパイル

mcs Program.cs

ビルドが終わるとProgram.exeができます。


3、バッチを作ります。
mono


set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set time_tmp=
set date_tmp=
echo %datetime% >> log.txt

mono Program.exe

set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set time_tmp=
set date_tmp=
echo %datetime% >> log.txt

VC#


set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set time_tmp=
set date_tmp=
echo %datetime% >> log.txt

Program.exe

set date_tmp=%date:/=%
set time_tmp=%time: =0%
set yyyy=%date_tmp:~0,4%
set yy=%date_tmp:~2,2%
set mm=%date_tmp:~4,2%
set dd=%date_tmp:~6,2%
set hh=%time_tmp:~0,2%
set mi=%time_tmp:~3,2%
set ss=%time_tmp:~6,2%
set sss=%time_tmp:~9,2%
set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
set time_tmp=
set date_tmp=
echo %datetime% >> log.txt

4、タスクスケジューラに登録し、実行速度を測ります。
monoの実行結果


2010060401200013 
2010060401201214 

VC# の実行結果


2010060401551672 
2010060401551674

VC#の実行時間が0.02秒に対してmonoだと 12.11秒掛かりました。

monoって落ち着いてますね。

※mono  実行速度で検索を掛けてみるとmono早いよ!って言うのもちらほら見るので今回の環境では遅かったのかな。。。

.NET2.0のクラスを使ったらコンパイルできない現象がおきたり、私自信がmonoをあまり理解できていない部分も多々あるので実務でmonoを使ってみよって方はご自身の環境でテストしてみてください。

今回使用したwindows版はこちらから
http://www.go-mono.com/mono-downloads/download.html

Windows版は.netランタイムをインストールしないと動かないみたいです。