Hi there,
I experience the same kind of numbers with your code, but you are comparing two different things. A more elaborated and fair comparison does show that you can sort very very quick in C# and very very slow in C if you want to. Using the same dataset, I get C with pointers : 0.016 s C with array in stead of pointers : 7.86 s C# Microsoft your quicksort : 10.68 s C# mono win your quicksort : 13.84 s C# Microsoft Array.Sort : 0.015 s C# mono win Array.Sort : 0.031 s This is realy not bad for C# or for mono. It would be interesting to see your quicksort with pointers in C#. Bart From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Yury Serdyuk Sent: 28 February 2008 14:51 To: [email protected] Subject: [Mono-list] C# program in 2000 times slower than equivalent Cprogram Hi! I have 2 implementations of Quicksort algorithm in C# and C++: #include <ctime> #include <string> #include <iostream> #include <iomanip> using namespace std; int read_data ( string filename, unsigned &N, int* &data ) { FILE *fd; size_t i; fd = fopen ( filename.c_str(), "r" ); if ( !fd ) { cerr << "Couldn't open file " << filename << endl; } fscanf ( fd, "%u", &N ); data = new int [ N ]; for ( i = 0; i < N; i++ ) fscanf ( fd, "%d", &data[i] ); fclose (fd); return 0; } void quicksort (int* first, int* last ) { int *k, *l; int pivot; int tmp; if ( first >= last ) return; pivot = *first; k = first + 1; l = last; while ( ( *k <= pivot ) && ( k < last ) ) k++; while ( *l > pivot ) l--; while ( k < l ) { //swap ( *k, *l ); tmp = *k; *k = *l; *l = tmp; do k++; while ( *k <= pivot ); do l--; while ( *l > pivot ); } //swap ( *first, *l ); tmp = *first; *first = *l; *l = tmp; quicksort ( first, l - 1); quicksort ( l + 1, last ); } int main ( int argc, char* arv[] ) { unsigned N; int* data; int ret; clock_t t0, t1; t0 = clock(); ret = read_data ( "InputData.in", N, data ); if ( ret ) { return 1; } t1 = clock(); cout << "read_data " << (double)(t1 - t0)/CLOCKS_PER_SEC << endl; t0 = clock(); quicksort ( data, data + N - 1 ); t1 = clock(); cout << "sort " << fixed << setprecision ( 10 ) << (double)(t1 - t0)/CLOCKS_PER_SEC << endl; delete[] data; return 0; } using System; using System.IO; public class QuicksortSimple { public static int[] x; public static void Main ( String[] args ) { int i; FileStream fs = new FileStream ( "InputData.in", FileMode.Open, FileAccess.Read ); StreamReader sr = new StreamReader ( fs ); int N = System.Convert.ToInt32 ( sr.ReadLine() ); Console.WriteLine ( "N = " + N ); x = new int [ N ]; DateTime dt1 = DateTime.Now; for ( i = 0; i < N; i++ ) x [ i ] = System.Convert.ToInt32 ( sr.ReadLine() ); DateTime dt2 = DateTime.Now; Console.WriteLine ( "read_data : " + (dt2-dt1).TotalSeconds ); sr.Close(); fs.Close(); dt1 = DateTime.Now; local_quicksort ( 0, x.Length - 1 ); dt2 = DateTime.Now; Console.WriteLine ( "sort time : " + (dt2-dt1).TotalSeconds ); } public static void local_quicksort ( int first, int last ) { int k, l; int tmp; if ( first >= last ) return; int pivot = x [ first ]; k = 1; l = last; while ( x [ k ] <= pivot && k < last ) k++; while ( x [ l ] > pivot ) l--; while ( k < l ) { tmp = x [ l ]; x [ l ] = x [ k ]; x [ k ] = tmp; do k++; while ( x [ k ] <= pivot ); do l--; while ( x [ l ] > pivot ); } tmp = x [ l ]; x [ l ] = x [ first ]; x [ first ] = tmp; local_quicksort ( first, l - 1 ); local_quicksort ( l + 1, last ); } } <> <>Running them gives: [EMAIL PROTECTED] Quicksort]$ ./quicksort2 read_data 0.06 sort 0.0100000000 [EMAIL PROTECTED] Quicksort]$ mono QuicksortSimple.exe N = 100000 Elapsed time : 20.815316 [EMAIL PROTECTED] Quicksort]$ mono -V Mono JIT compiler version 1.2.6 (tarball) Copyright (C) 2002-2007 Novell, Inc and Contributors. www.mono-project.com TLS: __thread GC: Included Boehm (with typed GC) SIGSEGV: normal Notifications: epoll Architecture: x86 Disabled: none Why? A code to generate an input file for both programs is as following: using System.IO; using System; public class FileWriter { public static void Main ( String[] args ) { int N = 100000; FileStream fs = new FileStream ( "InputData.in", FileMode.Create, FileAccess.Write ); StreamWriter sw = new StreamWriter ( fs ); Random rand = new Random(); sw.WriteLine ( N ); for ( int i = 0; i < N; i++ ) sw.WriteLine ( rand.Next( 10000 ) ); sw.Close(); fs.Close(); } <>} Thanks. DISCLAIMER(S): http://www.etro.vub.ac.be/disclaimer http://www.eqcologic.be/disclaimer
_______________________________________________ Mono-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-list
