C# vs MC++ -- Article Rebuttal

Ok, ada yg ga percaya perbedaan Managed C++ (MC++) dengan C#. Pertama, saya stress-kan, saya cuman iseng coba-coba praktek karena penasaran. Jadi saya tidak mengambil final conclusion (hence di blog saya sebelumnya pake tanda tanya “C# Lebih Cepat dari C++.Net?”).

 

Ada juga sebagian orang yg cuman liat, scroll dari atas ke bawah. Liat paragraf paling bawah, mungkin juga post comment. Padahal, kode sudah di depan, tinggal di copy-paste, compile. Not so hard is it?

 

Terakhir, ada yg tidak tahu apa itu Managed C++ dan Unmanaged C++ (atau Native C++ atau C++ biasa). ManagedC++ adalah sebuah bahasa .Net layaknya C#, dgn membuat extensi untuk normal C++. ManagedC++ akan di-JIT dan jalan di atas CLR layaknya program .Net lainnya.

 

So I'm NOT taking about code that uses:

#include <iostream>

using namespace std;

class KlasA{};

cout << “Blablabla“;

 

but I'm talking about code that uses:

#using <mscorlib.dll>

using namespace System;

__gc class KlasA{};

 Console::WriteLine(“Blablabla“);

 

Karena itu, berikut saya paparkan output dari console (spesifikasi mesin: Laptop Pentium 1Ghz Centrino, 512MB RAM, Windows XP SP2, .Net Framework 1.1 SP1):

 ---

D:\Temp>CPPNetBubbleSort.exe

Performa BubbleSort dgn CPPdotNet

 

Sebelum Sorting:

 

1 2 3 4 5 6 7 8 9 10

 

Sesudah Sorting:

 

1000 999 998 997 996 995 994 993 992 991

 

MC++ BubbleSort lamanya = 6.64441989135491 millidetik

 

D:\Temp>CSBubbleSort.exe

Performa BubbleSort dgn CSharp

 

Sebelum Sorting:

 

1 2 3 4 5 6 7 8 9 10

 

Sesudah Sorting:

 

1000 999 998 997 996 995 994 993 992 991

 

CSharp BubbleSort lamanya = 5.29676257736668 millidetik

--- 

 

Sapa tahu, mungkin di komputer lain, MC++ lebih cepat dari C#? That’s why copy-paste the codes and see the results on your own machine…

 

Lantas, ada myth bahwa gak masalah mau program di VB.Net, C#, Perl.Net, MC++, etc karena toh semua kode IL yg dihasilkan sama. Yg benar, semua language compiler .Net menghasilkan kode IL yg tujuannya sama. Mungkin ada compiler .Net yg lebih mengoptimize kode IL daripada compiler .Net lainnya.

 

Mari kita lihat kode IL yg dihasilkan MC++ dan C# untuk kode .Net yg sama (kode menggunakan BCL — Base Class Library — dan bisa dilihat dari artikel saya sebelumnya):

 

D:\Temp>ildasm /out=MC++Generate.meta /source CPPNetBubbleSort.exe

  //  Disassembly of native methods is not supported.

 

D:\Temp>ildasm /out=CSGenerate.meta /source CSBubbleSort.exe

// WARNING: Created Win32 resource file CSGenerate.res

 

Sekarang buka file MC++Generate.meta dan CSGenerate.meta di Visual Studio atau Text Editor yg bisa menampilkan Line Number. Hitung jumlah baris untuk fungsi Main(). Cara gampangnya, line no. yg ada

} // end of method CSBubbleSort::Main

MINUS line no. yg ada     

IL_0000:  ldstr      "Performa BubbleSort dgn CSharp"

MINUS jumlah line kosong.

 

Hasilnya:

Jumlah baris kode IL yg digenerate oleh MC++: 140

Jumlah baris kode IL yg digenerate oleh C#: 136

 

Jumlah lokal variable di Main untuk MC++ (10):

  .locals (int32[] V_0,

           int32 V_1,

           int32 V_2,

           int32 V_3,

           int32 V_4,

           int32 V_5,

           int32 V_6,

           class [TimerAkurat]Zedilabs.TimerAkurat V_7,

           int32 V_8,

           int32 V_9,

           float64 V_10)

 

Jumlah lokal variable di Main untuk C# (8):

      .locals init (int32[] V_0,

               int32 V_1,

               int32 V_2,

               class [TimerAkurat]Zedilabs.TimerAkurat V_3,

               int32 V_4,

               int32 V_5,

               int32 V_6,

               int32 V_7,

               float64 V_8)

 

Perbedaan lainnya, IL MC++ memanggil:

instance void [mscorlib]System.Array::Initialize()

sedangkan IL C# tidak, padahal kodenya sama:

 

MC++:

int array __gc[] = new int __gc[1000];

C#:

int[] array = new int[1000];

 

*Tapi itu tidak menentukan dalam test ini karena kodenya berada sebelum Timer::Start().

 

Lantas lihat kedua kode IL setelah:

instance void [TimerAkurat]Zedilabs.TimerAkurat::Mulai()

Akan terlihat bahwa IL yg digenerate C# beda dgn IL yg digenerate MC++.

 

Jadi memang kode IL yg digenerate ManagedC++ lebih panjang dan local variable yg digenerate pun sedikit lebih banyak daripada C#. Mungkin ini yg menyebabkan kode ManagedC++  1 millidetik lebih lambat daripada kode C#. Dan ini asumsi saya loh. Silakan buat asumsi sendiri, atau koreksi di comment yah…Lagian 1 millidetik gak masalah banget kan? Kalo 20 millidetik++ baru surprising...

 

So, compiler CL.exe (MC++) memang cepat untuk Native C++, bahkan di forum Microsoft.DotNet.Framework.Performance ada yg bilang lebih cepat dari Visual C++ 6.0. Namun, ManagedC++ ini sepertinya tidak melakukan banyak optimization untuk IL. Kabarnya ini akan berubah di Visual C++ 2005. [baca artikel Write Faster Code with the Modern Language Features of Visual C++ 2005]

 

Sebaliknya, C# sebagai bahasa baru dan dimotori oleh pembuat Turbo Pascal & Delphi, Mr Anders Hejlsberg, ternyata benar-benar di-optimize compiler nya.

 

DISCLAIMER:

Saya tidak bilang C# better than MC++ atau vice-versa, dan tidak ingin berada dalam religious war of .Net programming language. Mau nulis dgn C# silahkan, VB.Net silahkan. Karena platform .Net memungkinkan language-neutral, dan juga karena programmer veteran biasanya males belajar construct language baru, saya pun interested dgn paradigma language-neutral ini. Artikel MC++ saya ya buat C++ programmer, dan artikel C# pun ya buat C# programmer... so buat C++ programmer yg "marah" dibilang C++ slower than C#, well you've read the title and jumped to "Post comment" without reading the whole article as a whole.

Share this post: | | | |
Published Friday, March 18, 2005 5:21 AM by zeddy
Filed under:

Comments

No Comments
Powered by Community Server (Commercial Edition), by Telligent Systems