2010/06/04 カテゴリ : C#  mono  Tech 

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

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

みなさん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ファイルで行います。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. //using System.Diagnostics;
  6.  
  7. namespace ConsoleApplication1
  8. {
  9.     class Program
  10.     {
  11.         public static void Main(string[] args)
  12.         {
  13.  
  14.             //Stopwatch sw = new Stopwatch();
  15.  
  16.             //sw.Start();
  17.  
  18.             const int max = 1000000;
  19.             bool[] prime = new bool[max];
  20.             prime[0] = false;
  21.             prime[1] = false;
  22.             int count = 0;
  23.  
  24.             for (int i = 2; i < max; i++){
  25.                 prime[i] = true;
  26.             }
  27.             for (int i = 2; (i * i) < max; i++){
  28.                 if (prime[i] == true){
  29.                     for (int y = (i << 1); y < max; y += i){
  30.                         if (prime[y] == true){
  31.                             prime[y] = false;
  32.                             count++;
  33.                         }
  34.                     }
  35.                 }
  36.             }
  37.             for (int i = 2; i < max; i++){
  38.                 if (prime[i] == true)
  39.                     Console.WriteLine(i);
  40.             }
  41.  
  42.             //sw.Stop();
  43.  
  44.             //long millisec = sw.ElapsedMilliseconds;
  45.  
  46.             //Console.WriteLine(millisec);
  47.  
  48.  
  49.  
  50.         }
  51.  
  52.  
  53.     }
  54. }

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

mcs Program.cs

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


3、バッチを作ります。
mono
  1. set date_tmp=%date:/=%
  2. set time_tmp=%time: =0%
  3. set yyyy=%date_tmp:~0,4%
  4. set yy=%date_tmp:~2,2%
  5. set mm=%date_tmp:~4,2%
  6. set dd=%date_tmp:~6,2%
  7. set hh=%time_tmp:~0,2%
  8. set mi=%time_tmp:~3,2%
  9. set ss=%time_tmp:~6,2%
  10. set sss=%time_tmp:~9,2%
  11. set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
  12. set time_tmp=
  13. set date_tmp=
  14. echo %datetime% >> log.txt
  15. mono Program.exe
  16. set date_tmp=%date:/=%
  17. set time_tmp=%time: =0%
  18. set yyyy=%date_tmp:~0,4%
  19. set yy=%date_tmp:~2,2%
  20. set mm=%date_tmp:~4,2%
  21. set dd=%date_tmp:~6,2%
  22. set hh=%time_tmp:~0,2%
  23. set mi=%time_tmp:~3,2%
  24. set ss=%time_tmp:~6,2%
  25. set sss=%time_tmp:~9,2%
  26. set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
  27. set time_tmp=
  28. set date_tmp=
  29. echo %datetime% >> log.txt
VC#
  1. set date_tmp=%date:/=%
  2. set time_tmp=%time: =0%
  3. set yyyy=%date_tmp:~0,4%
  4. set yy=%date_tmp:~2,2%
  5. set mm=%date_tmp:~4,2%
  6. set dd=%date_tmp:~6,2%
  7. set hh=%time_tmp:~0,2%
  8. set mi=%time_tmp:~3,2%
  9. set ss=%time_tmp:~6,2%
  10. set sss=%time_tmp:~9,2%
  11. set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
  12. set time_tmp=
  13. set date_tmp=
  14. echo %datetime% >> log.txt
  15. Program.exe
  16. set date_tmp=%date:/=%
  17. set time_tmp=%time: =0%
  18. set yyyy=%date_tmp:~0,4%
  19. set yy=%date_tmp:~2,2%
  20. set mm=%date_tmp:~4,2%
  21. set dd=%date_tmp:~6,2%
  22. set hh=%time_tmp:~0,2%
  23. set mi=%time_tmp:~3,2%
  24. set ss=%time_tmp:~6,2%
  25. set sss=%time_tmp:~9,2%
  26. set datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%%sss%
  27. set time_tmp=
  28. set date_tmp=
  29. echo %datetime% >> log.txt
4、タスクスケジューラに登録し、実行速度を測ります。
monoの実行結果
  1. 2010060401200013 
  2. 2010060401201214 
VC# の実行結果
  1. 2010060401551672 
  2. 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ランタイムをインストールしないと動かないみたいです。

コメント

    • とおりすがった
    • 2010年06月23日 13:00
    • バッチの中で10回ずつくらい繰り返してその総計を回数で割って、、、程度のことをしないと単純に一回だけやって早いも遅いもなんもあったもんじゃないでしょ。
      あと、2行目から14行目も計測時刻に含まれていますね。

      コンピュータの比較計測のはじめの一歩からやり直しましょうね。

コメントフォーム

認証
captcha_key
 
 

トラックバックURI

最近の記事

アシアルPHP書籍情報