Java vs. C#
-
also der Code macht wohl nur bei mir einen Segfault, woanders geht der ohne Probleme. Hier poste ich ihn mal (die C Like Version)
#include <iostream> #include <cstdlib> #include <cmath> #include <cstring> #include <limits> #include <fstream> using namespace std; #include <sys/time.h> int less(const void *a, const void *b) { return a<b; } int main() { struct timeval times[7]; struct timezone tz; const size_t arrayLength=5000000; size_t i=0; //Arrays erzeugen gettimeofday(×[0],&tz); int *intArray=new int[arrayLength]; double *doubleArray=new double[arrayLength]; gettimeofday(×[1],&tz); //Zufallszahlen for(;i<arrayLength;++i) { intArray[i]=static_cast<int>(numeric_limits<int>::max()*rand()/RAND_MAX+1.0); doubleArray[i]=(numeric_limits<double>::max()*rand()/RAND_MAX+1.0); } gettimeofday(×[2],&tz); //Sortieren qsort(static_cast<void*>(intArray),arrayLength,sizeof(int),less); gettimeofday(×[3],&tz); //int to char char strBuffer[10]; char stringBuffer[arrayLength*11+1]; for(i=0;i<arrayLength;++i) { sprintf(strBuffer,"%d\n",intArray[i]); strcat(stringBuffer,strBuffer); } gettimeofday(×[4],&tz); //string in Datei schreiben ofstream out("demo.txt"); if(!out.is_open()) { cerr << "Fehler" << endl; return 1; } out << stringBuffer; out.close(); gettimeofday(×[5],&tz); //Wurzeln berechnen for(i=0;i<arrayLength;++i) doubleArray[i]=sqrt(doubleArray[i]); gettimeofday(×[6],&tz); //Ausgabe: cout << "Array erzeugen: " << times[1].tv_usec-times[0].tv_usec << "ms" << endl; cout << "Zufallszahlen erzeugen: " << times[2].tv_usec-times[1].tv_usec << "ms" << endl; cout << "Sortieren: " << times[3].tv_usec-times[2].tv_usec << "ms" << endl; cout << "String anhängen: " << times[4].tv_usec-times[3].tv_usec << "ms" << endl; cout << "Speichern: " << times[5].tv_usec-times[4].tv_usec << "ms" << endl; cout << "Wurzeln berechnen: " << times[6].tv_usec-times[5].tv_usec << "ms" << endl; }
[ Dieser Beitrag wurde am 07.10.2002 um 21:27 Uhr von kingruedi editiert. ]
-
warum macht der den aus & times dieses x?
×
[ Dieser Beitrag wurde am 07.10.2002 um 21:29 Uhr von kingruedi editiert. ]
-
Schickst du mir bitte eine ausführbare Datei?! ...du kannst das bestimmt besser kompilieren, als ich! (...ich habe hier gerade nichtmal nen C++-Kompiler zur Verfügung )
-
kann dir nur eine binäre Datei für Linux liefern. Was dir aber nichts bringt, wenn meine Binärys immer einen SegFault enthalten
-
OK! Ich habe mir jetzt mal MinGW besorgt und versuche, die Datei zu kompilieren. Allerdings bekomme ich ein paar Fehlermeldungen. Da ich mich mit C++ nicht auskenne, kann ich damit nicht allzuviel anfangen. ...ihr müßt mir da mal weiterhelfen :
Benchmark.cpp:19: aggregate 'timezone tz' has incomplete type and cannot be defined
Benchmark.cpp:24: 'gettimeofday' undeclared (first use this function)
Benchmark.cpp:38: use of 'less' is ambiguous;
Benchmark.cpp:12: first declared as 'int less(const void*, const void*)' here c:/c++/mingw/include/c++/3.2/bits/stl_function.h:195: also declared as 'template<class _Tp> struct std::less' here[ Dieser Beitrag wurde am 07.10.2002 um 22:16 Uhr von Gregor editiert. ]
-
gettimeofday funktioniert nur unter Unices. Ich weiss nicht, wie das in WinAPI geht.
-
GetTickCount
-
Original erstellt von kingruedi:
gettimeofday funktioniert nur unter Unices. Ich weiss nicht, wie das in WinAPI geht.Ich werde mich demnächst mal umhören. ...könnte allerdings ein paar Tage dauern. Vielleicht gibt es ja hier jemanden, der schneller ist und entsprechenden Code postet.
Edit : Da war wohl tatsächlich einer schnell.
...wie kann man das einbinden? ...ich denke mal, ich kann das nicht einfach ersetzen, oder?
[ Dieser Beitrag wurde am 07.10.2002 um 22:38 Uhr von Gregor editiert. ]
-
besorg dir am besten den Cygnus C++, weil der ist wohl Unix kompatibel.
-
Also, ich habs mal für Windows umgeschrieben.
#include <iostream> #include <cstdlib> #include <cmath> #include <cstring> #include <limits> #include <fstream> using namespace std; #include <windows.h> #ifdef _MSC_VER #undef max #endif int myless(const void *a, const void *b) { return a<b; } int main() { DWORD times[7]; const size_t arrayLength=5000000; size_t i=0; //Arrays erzeugen times[0] = GetTickCount(); int *intArray=new int[arrayLength]; double *doubleArray=new double[arrayLength]; times[1] = GetTickCount(); //Zufallszahlen for(;i<arrayLength;++i) { intArray[i]=static_cast<int>(numeric_limits<int>::max()*rand()/RAND_MAX+1.0); doubleArray[i]=(numeric_limits<double>::max()*rand()/RAND_MAX+1.0); } times[2] = GetTickCount(); //Sortieren qsort(static_cast<void*>(intArray),arrayLength,sizeof(int),myless); times[3] = GetTickCount(); //int to char char strBuffer[10]; char *stringBuffer = new char[arrayLength*11+1]; for(i=0;i<arrayLength;++i) { sprintf(strBuffer,"%d\n",intArray[i]); strcat(stringBuffer,strBuffer); } times[4] = GetTickCount(); //string in Datei schreiben ofstream out("demo.txt"); if(!out.is_open()) { cerr << "Fehler" << endl; return 1; } out << stringBuffer; out.close(); times[5] = GetTickCount(); //Wurzeln berechnen for(i=0;i<arrayLength;++i) doubleArray[i]=sqrt(doubleArray[i]); times[6] = GetTickCount(); //Ausgabe: cout << "Array erzeugen: " << times[1] - times[0] << "ms" << endl; cout << "Zufallszahlen erzeugen: " << times[2] - times[1] << "ms" << endl; cout << "Sortieren: " << times[3] - times[2] << "ms" << endl; cout << "String anhängen: " << times[4] - times[3] << "ms" << endl; cout << "Speichern: " << times[5] - times[4] << "ms" << endl; cout << "Wurzeln berechnen: " << times[6] - times[5] << "ms" << endl; delete[] intArray; delete[] doubleArray; delete[] stringBuffer; }
[Edit]Array auf dem Heap anstatt auf dem Stack[/Edit]
[ Dieser Beitrag wurde am 08.10.2002 um 16:52 Uhr von thomas80d editiert. ]
-
thomas: Der Code ist fehlerhaft. Es entsteht eine unbehandelte Ausnahme. War vielleicht nur Glück das er bei dir funktionierte.
-
Ich bin auch wieder zu blöd, um den Code zu kompilieren.
Zwei der Fehler, die vorher schon da waren, sind jetzt immer noch da :Benchmark.cpp:36: use of 'less' is ambiguous;
Benchmark.cpp:11: first declared as 'int less(const void*, const void*)' here c:/c++/mingw/ include/c++/3.2/bits/stl_function.h:195: also declared as 'template<class _Tp> struct std::less' here...wenn es eine auf Win kompiliert kriegt, dann kann er mir ja die Datei schicken.
-
Ach so sorry, ich musste maximale Stackgröße noch erhöhen, dann liefs.
Ich kann nur leider nicht testen, ob die Zeitausgabe okay ist, da das Programm ziemlich lange läuft auf meinem Rechner. Hab jetzt grad keine Lust, WinXP nach 1 Woche Laufzeit neu zu starten.
-
das soll lieber nochmal ein anderer schreiben. ich glaub thomas80d kann das nicht so gut
-
Original erstellt von <o>:
das soll lieber nochmal ein anderer schreiben. ich glaub thomas80d kann das nicht so gutHilf uns besser mit Code, der bei mir kompiliert, anstatt Müll zu reden!
-
sorry, tut mir leid, ich kann es auch nicht.
aber der code von thomas dauert ja viel zu lange, wenn er meint 1 woche
-
warum schickt thomas80d dir nicht einfach die ausführbare datei?
-
Original erstellt von <o>:
warum schickt thomas80d dir nicht einfach die ausführbare datei?Hat er gemacht. ...und die Datei wird wohl auch ausgeführt. Es entsteht auch kein Fehler. Allerdings scheint wohl trotzdem etwas mit dem Programm nicht in Ordnung zu sein. Nachdem das Programm länger als 1,5 Stunden gelaufen ist (ich habe es dann abgebrochen), liegt die Vermutung nahe, dass irgendwo eine Endlosschleife entstanden ist. Da noch keine Textdatei erstellt wurde, wird sich die Endlosschleife wohl davor befinden. Wer findet sie zuerst?!
Wenn mir einer eine ausführbare Datei schickt, bei der es nach jedem Schritt eine Ausgabe gibt, dann sag ich Bescheid, bis wo das Programm kommt.
[ Dieser Beitrag wurde am 08.10.2002 um 04:02 Uhr von Gregor editiert. ]
-
Dass das Programm solange läuft, liegt an der Stringverkettung. Das sprintf mit anschließendem strcat ist anscheinend ziemlich lahm.
-
Original erstellt von thomas80d:
Dass das Programm solange läuft, liegt an der Stringverkettung. Das sprintf mit anschließendem strcat ist anscheinend ziemlich lahm....also sprintf erzeugt wohl einen temporären String, der erstmal zur Speicherung der Zahl benutzt wird. ...das habe ich in Java auch einmal gemacht, allerdings hat das nur etwa 20 Sekunden länger gedauert. ...bei weitem nicht 500 mal so lange.
Was macht strcat? Ich glaube nicht, dass der ganze vorhandene String bei strcat umkopiert wird, oder? ...selbst, wenn das der Fall wäre, wäre eine um das 500fache längere Laufzeit noch viel zu hoch.
...ich kann mir nicht vorstellen, dass das soooo lahm ist.