Benutzer mit den meisten Antworten
Zeit einer Array- Sortierung messen!

Frage
-
Guten Abend Community,
die Erstellung einer Zeitmessung für eine Array- Sortierung stellt mich vor einige Unklarheiten...
Ablauf: Wenn ich den "Start"- Button drücke soll folgendes passieren,
- Initialisierung eines dynamischen Feldes mit 10.000.000 Zufallszahlen die zwischen 1 und 100 liegen
- Zeitmessung starten
- Übergabe des Feldes an meine Sortierklasse, in dem Fall Selection Sort
- Zeitmessung beenden
Die Zeitmessung habe ich derzeit über ein Label anzeigen lassen, dass mit einem Timer kommuniziert. Da ich mit dem Timer noch nicht gearbeitet habe, habe ich zuerst mal ausprobiert wie der Timer an sich arbeitet. Dazu habe ich einfach mal eine Stoppuhr geschrieben und die funktioniert ohne Probleme. Allerdings funktioniert diese nicht in Verbindung mit meinem Vorhaben.
System::Void MyForm::but_start_Click(System::Object^ sender, System::EventArgs^ e) { #define MAX 10000000 Sortieren sort = Sortieren(); int* ar_zufall = new int[MAX]; int zufallszahl; int i; time_t t; time(&t); srand((unsigned int)t); for (i = 0; i < MAX; i++) { zufallszahl = 0; zufallszahl = (rand() % 100) + 1; ar_zufall[i] = zufallszahl; } timer1->Start(); sort.selectionsort(ar_zufall, MAX); timer1->Stop(); delete[] ar_zufall; } System::Void MyForm::timer1_Tick(System::Object^ sender, System::EventArgs^ e) { label1->Text = Convert::ToString(Convert::ToDouble(label1->Text) + 0.1); }
Hoffe das Problem ist verständlich und mir kann geholfen werden :)
MfG SnitsuD
Antworten
-
Hallo,
mit einem Timer wirst du keine genaue Messung bekommen. Das Problem ist, dass die Ticks mindestens Interval Millisekunden auseinander liegen. Der Wert kann auch größer sein. Ohne kontinuierliche Anzeige würde man vermutlich die Stopwatch-Klasse einsetzen. In deinem Fall aber solltest du dir die Startzeit (DateTime.Now) merken und diese immer im Tick-Eventhandler vom dann aktuellen Zeitpunkt abziehen und das dann anzeigen:
label1->Text = (startTime - DateTime::Now).ToString();
Diesen Code solltest du auch nochmal aufrufen, sobald du den immer stoppst.
Ein anderes Problem könnte der Threadübergreifende Zugriff sein, da der Tick-Eventhandler in einem anderen Thread ausgeführt wird als die UI. Die UI anpassen kann aber nur der UI-Thread selbst, daher musst du die Invoke-Methode damit beauftragen. Im verlinkten MSDN Artikel findest du auch ein Beispiel dafür.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 31. Dezember 2015 11:29
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 8. Januar 2016 06:48
-
Hallo SintsuD,
wenn Du C++/CLI einsetzt, kannst Du die Stopwatch Klasse verwenden.
Für natives C++ verwende die High Resolution Timer - auf denen auch die Stopwatch basiert, siehe
Acquiring high-resolution time stamps.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 31. Dezember 2015 11:29
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 8. Januar 2016 06:48
Alle Antworten
-
Hallo,
mit einem Timer wirst du keine genaue Messung bekommen. Das Problem ist, dass die Ticks mindestens Interval Millisekunden auseinander liegen. Der Wert kann auch größer sein. Ohne kontinuierliche Anzeige würde man vermutlich die Stopwatch-Klasse einsetzen. In deinem Fall aber solltest du dir die Startzeit (DateTime.Now) merken und diese immer im Tick-Eventhandler vom dann aktuellen Zeitpunkt abziehen und das dann anzeigen:
label1->Text = (startTime - DateTime::Now).ToString();
Diesen Code solltest du auch nochmal aufrufen, sobald du den immer stoppst.
Ein anderes Problem könnte der Threadübergreifende Zugriff sein, da der Tick-Eventhandler in einem anderen Thread ausgeführt wird als die UI. Die UI anpassen kann aber nur der UI-Thread selbst, daher musst du die Invoke-Methode damit beauftragen. Im verlinkten MSDN Artikel findest du auch ein Beispiel dafür.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 31. Dezember 2015 11:29
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 8. Januar 2016 06:48
-
Hallo SintsuD,
wenn Du C++/CLI einsetzt, kannst Du die Stopwatch Klasse verwenden.
Für natives C++ verwende die High Resolution Timer - auf denen auch die Stopwatch basiert, siehe
Acquiring high-resolution time stamps.
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 31. Dezember 2015 11:29
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 8. Januar 2016 06:48