素数を数えて落ち着くんだ
バッチが思った以上に時間が掛かってハラハラドキドキした経験はないですか?
そんな時は素数を数えて落ち着きましょう。
みなさんmonoプロジェクトはご存知でしょうか?
UNIX系Linux系MacでC#を動かしちゃおうと言うプロジェクトなんですが、
今回はmono(2.6.4)でコンパイル、実行したPGとVC#でコンパイルしたPGでどれぐらい実行速度が変わるか計測してみます。
計測方法は同じスペックのPCを使ってLinux、Windowsで違いを測って見たかったのですが、いろいろ大人の事情ってやつで、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ランタイムをインストールしないと動かないみたいです。