Wednesday, July 21, 2004

ทดสอบ Mono กะเขาบ้าง

วันก่อนโต้งเอา Mono มาเล่น พอดีเครื่อง Linux อยู่ใกล้มือ ก็เลยเอามาลองดูบ้าง อยากรู้ว่ามีอะไรแตกต่างกับบน Windows แค่ไหน

ตั้งใจจะลองทำโปรแกรมให้ตรวจสอบได้เองว่า ตอนนี้รันอยู่บน Mono หรือบน .Net/Windows ก็เข้าไปเจอว่าใน System.Environment สามารถดู ชื่อ OS ได้ ลองเอา Hello World ของโต้ง มาแก้ให้มันพิมพ์ข้อมูลพวกนี้ออกมาดู แถมด้วยจับเวลา PiBench ฯลฯ ที่ชอบทดสอบ


using System;
using System.Diagnostics;

public class HelloWorld {    
  public static void Main(string[] args)
  {        
    Console.WriteLine("Hello World!");

    for(int i=0;i<args.Length;i++)
      Console.WriteLine(args[i]);

    Console.WriteLine("Bench Starts");
    int t1 = System.Environment.TickCount;
    int r1 = testInt();
    int t2 = System.Environment.TickCount;
    int r2 = testDouble();
    int t3 = System.Environment.TickCount;
    int r3 = testPibench();
    int t4 = System.Environment.TickCount;

    Console.WriteLine("Int "+r1+": "+(t2-t1)+" mSec");
    Console.WriteLine("Dbl "+r2+": "+(t3-t2)+" mSec");
    Console.WriteLine("Pibench "+r3+": "+(t4-t3)+" mSec");

    Console.WriteLine(getSysInfo());

  }

  static int testInt()
  {
    int i;
    int a=1;
    for(i=0;i<10000000;i++)
      a=a*7%39;
    return a;
  }

  static int testDouble()
  {
    int i;
    double a=1;
    for(i=3;i<1500000;i+=4) {
      a = a - 1.0/i + 1.0/(i+2);
    }
    return (int)(a*40000.0);
  }

  static int testPibench()
  {
    int i,j;
    int a=0;
    double x=0;
    for(i=1;i<30000000;i+=4) {
      x += 1.0/i - 1.0/(i+2);
    }
    return (int)(x*4000000.0);
  }

    static string getSysInfo() 
    {
      string nl = System.Environment.NewLine;
      Process cP = Process.GetCurrentProcess();
 
      string msg = 
        "-- System Information --" + nl +
        "ENV CLR Version: "+System.Environment.Version.ToString()+nl+
        "ENV Platform: "+System.Environment.OSVersion.Platform.ToString()+nl+
        "ENV OSVersion: "+System.Environment.OSVersion.Version.ToString()+nl+
        "ENV CmdLine: "+System.Environment.CommandLine+nl+
        "ENV Hostname: "+System.Environment.MachineName+nl+
        "ENV CWD: "+System.Environment.CurrentDirectory+nl+
        "ENV WorkingSet (MappedMemory): "+System.Environment.WorkingSet+nl+nl+

        "Process MaxWorkingSet: "+ cP.MaxWorkingSet + nl +
        "Process MinWorkingSet: "+ cP.MinWorkingSet + nl +
        "Process PeakWorkingSet: "+ cP.PeakWorkingSet + nl +
        "Process WorkingSet: "+ cP.WorkingSet + nl +
        "Process NonpagedSystemMemorySize: "+cP.NonpagedSystemMemorySize + nl+
        "Process PagedSystemMemorySize: "+cP.PagedSystemMemorySize + nl+
        "Process PagedMemorySize: "+cP.PagedMemorySize + nl+
        "Process PeakPagedMemorySize: "+cP.PeakPagedMemorySize + nl+
        "Process PeakVirtualMemorySize: "+cP.PeakVirtualMemorySize + nl+
        "Process PrivateMemorySize: "+cP.PrivateMemorySize + nl+
        "Process VirtualMemorySize: "+cP.VirtualMemorySize + nl+
        "Process Name: "+cP.ProcessName + nl+ nl+

        "Process StartTime: "+cP.StartTime + nl + 
        "Process TotalProcessorTime: "+cP.TotalProcessorTime + nl +
        "Process UserProcessorTime: "+cP.UserProcessorTime + nl +
        "Process PrivilegedProcessorTime: " + cP.PrivilegedProcessorTime + nl +
        "";
      return msg;
    }

}

ผลที่ได้บน Mono/Linux คือ

Hello World!
arg1
arg2
Bench Starts
Int 22: 855 mSec
Dbl 31415: 60 mSec
Pibench 3141592: 1124 mSec
-- System Information --
ENV CLR Version: 1.1.4322.573
ENV Platform: 128
ENV OSVersion: 2.4.22.1
ENV CmdLine: /home/vuthi/Mono/test.exe arg1 arg2
ENV Hostname: crusoe
ENV CWD: /home/vuthi/Mono
ENV WorkingSet (MappedMemory): 0

Process MaxWorkingSet: 1413120
Process MinWorkingSet: 204800
Process PeakWorkingSet: 0
Process WorkingSet: 0
Process NonpagedSystemMemorySize: 0
Process PagedSystemMemorySize: 0
Process PagedMemorySize: 0
Process PeakPagedMemorySize: 0
Process PeakVirtualMemorySize: 0
Process PrivateMemorySize: 0
Process VirtualMemorySize: 0
Process Name: test

Process StartTime: 7/21/2004 6:17:20 PM
Process TotalProcessorTime: 00:00:00
Process UserProcessorTime: 00:00:00
Process PrivilegedProcessorTime: 00:00:00

เอาไฟล์ .exe อันเดียวกัน ไปรันบน Windows ได้ผล

Hello World!
Bench Starts
Int 22: 570 mSec
Dbl 31415: 20 mSec
Pibench 3141592: 461 mSec
-- System Information --
ENV CLR Version: 1.1.4322.573
ENV Platform: Win32NT
ENV OSVersion: 5.1.2600.0
ENV CmdLine: test
ENV Hostname: P4
ENV CWD: C:\Documents and Settings\vuthi\Desktop
ENV WorkingSet (MappedMemory): 5373952

Process MaxWorkingSet: 1413120
Process MinWorkingSet: 204800
Process PeakWorkingSet: 10035200
Process WorkingSet: 10035200
Process NonpagedSystemMemorySize: 10752
Process PagedSystemMemorySize: 51700
Process PagedMemorySize: 6979584
Process PeakPagedMemorySize: 6979584
Process PeakVirtualMemorySize: 169967616
Process PrivateMemorySize: 6979584
Process VirtualMemorySize: 169967616
Process Name: test

Process StartTime: 7/21/2004 6:18:51 PM
Process TotalProcessorTime: 00:00:01.3219008
Process UserProcessorTime: 00:00:01.1115984
Process PrivilegedProcessorTime: 00:00:00.2103024

ดูเหมือน Mono ยังลักไก่ไม่ Implement อยู่หลายค่า พวกเวลา/Memory ของ Process เนี่ยแทบไม่ขึ้นเลย Platform ก็ขึ้นเป็นตัวเลข ยังหาไม่เจอว่าจะเอา string มาได้หรือเปล่าอย่างไร

เวลาที่ใช้ในการคำนวนเอามาเทียบอะไรไม่ได้ ผลมาจากคนละเครื่อง

หมายเหตุ: Blog นี้ชักยาว ไปแก้ Atom ให้ส่งแค่สรุปสั้นๆ (ย่อหน้าแรก) แล้ว

1 comment:

poonlap said...

ลินุกซ์ช้ากว่าตามฟอร์มคน implement ตาม Microsoft.
พี่ฮุ้ยลอง Portable DotGNU หรือยัง?