Laden...

Dauer eines Schleifendurchlaufs berechnen

Erstellt von snsewill vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.369 Views
S
snsewill Themenstarter:in
18 Beiträge seit 2013
vor 10 Jahren
Dauer eines Schleifendurchlaufs berechnen

Hallo,

wie kann ich die Dauer eines Schleifendurchlaufs berechnen bzw. gibt es eine Tabelle in der die Zykluszeiten von C# Befehlen/Operationen stehen?

Als Beispiel:

Ich habe eine For-Schleife die 10^12 mal durchlaufen werden soll, in der Schleife wird bisher noch nichts ausgeführt. Der Prozessor hat 3GHz. Wie berechne ich nun die Zeit die benötigt wird um die Schleife zu durchlaufen?

1.552 Beiträge seit 2010
vor 10 Jahren

Hallo snsewill,

mit der Uhr (scrn) 😁
Ne, Spass beiseite. Benutze die Stopwatch Klasse des Frameworks.

Gruß,
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
9 Beiträge seit 2013
vor 10 Jahren

Hallo,

@xxMUROxx:
ich glaube snsewill möchte im voraus wissen wie lange der Durchlauf dauert.

@snsewill:
eine genaue Vorausberechnung eines Schleifendurchlaufs wird dir hier nicht gelingen, da sich dein Programm die Rechenzeit auf dem Prozessor mit anderen Programmen und dem Betriebssystem teilen muss. Ausserdem kannst du nicht voraussagen, wie und wann das Betriebssystem deinem Programm Rechenzeit zuteilt.

Eine solche Berechnung wird normalerweise nur auf Micorcontrollern gemacht, und da auch nur sinnvoll bei Betrachtung des Assembler Codes, da hier das Programm sozusagen "Alleinherscher" ist und 100% der Rechenzeit hat.

Was willst du mit dieser Berechnung eigentlich erreichen?

Wenn du nur wissen willst wie lange das ungefähr dauert, mach mehrmals einen Test mit der von xxMUROxx vorgeschlagenen Lösung und vergleiche die Zeiten.

Sourcerer

zum Thema Busanalyse: ein Oszi lügt nicht!!! 😉

16.806 Beiträge seit 2008
vor 10 Jahren

Das geht nur annäherungsweise.
Sprich Du berechnest alle 100 / 1000 / 1000 / n Durchläufe
a) wie lange Du bisher gebraucht hast
b) kannst mittels 3-Satzes die ungefähre Endzeit berechnen.

S
snsewill Themenstarter:in
18 Beiträge seit 2013
vor 10 Jahren

ich habe ein Programm das 10^12 vergleiche durchführen muss, dabei werden noch einige Rechnungen ausgeführt usw. Ich habe dann nach 10 min mal das Programm unterbrochen und mir den Zählerstand der äußeren Schleife angesehen. Dann habe ich hochgerechnet wie lange das Programm noch braucht dabei bin ich auf eine Zeit von 4 Wochen gekommen...Daher wollte ich mal eine genaue Berechnung anstellen.

16.806 Beiträge seit 2008
vor 10 Jahren

Nichts anderes als die programmatische 3-Satz-Variante.
PS: Schleifen mit innen-liegenden Berechnungen lassen sich in der Regel effizient parallelisieren.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo zusammen,

10^12 Vergleiche, wenn es Elementarvergleiche sind, z.B. i > 5, sollte auf einen heutigen Rechner innerhalb von Sekunden möglich sein.

Ohne nähere Angaben kann man nicht sagen, ob die Laufzeit der inneren Schleife bei jedem äußeren Schleifendurchlauf halbwegs gleichbeleibend ist.

Bei einer Konstruktion wie z.B.

for (int i1 = 0; i1 < 100; ++i1) {
   for (int i2 = 0; i2 < i1; ++i2) {

würde die Laufzeit der innere Schleife bei jedem äußeren Schleifendurchlauf immer (etwas) länger, so dass die Gesamtkonstruktion quadratischen Aufwand hätte. Und dabei in etwa die halbe Laufzeit von

for (int i1 = 0; i1 < 100; ++i1) {
   for (int i2 = 0; i2 < 100; ++i2) {

Andersherum würde bei die Laufzeit der inneren Schleife bei folgendem Code immer kürzer und die zweite Hälfte der äußeren Schleifendurchläufe geht wesentlich schneller als die erste Hälfte.

for (int i1 = 0; i1 < 100; ++i1) {
   for (int i2 = 0; i2 < 100 - i1; ++i2) {

Mit einfachem Dreisatz ist es je nach Situation also nicht getan.

herbivore

3.825 Beiträge seit 2006
vor 10 Jahren

Wenn Du die Anzahl der Schleifendurchläufe kennst kannst Du ja so alle 10 Sekunden anzeigen wieviele Du schon hattest und wieviel Prozent.

Wenn Du gut bis rechne noch aus wieviel Tage / Stunden / Minuten dein Programm noch braucht.

Grüße Bernd

Hinweis von herbivore vor 10 Jahren

Damit auch die folgenden Generationen den Witz noch verstehen: Er bezieht sich auf die Zeit bis einschließlich Windows XP. Da sprang die Restzeitangabe mitunter doch sehr wild hin und her. Ab Windows Vista/7 ist die Vorhersage besser geworden. Eine exakte Vorhersage wird bei mechanischen Festplatten sowieso nie möglich, getreu der Weisheit, dass Prognosen immer schwierig sind, besonders wenn sie die Zukunft betreffen.

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

C
2.121 Beiträge seit 2010
vor 10 Jahren

Ich mach das inzwischen gern mal so:
Ausdenken wie viele Durchläufe einer Aktion die Obergrenze sein könnten. Zeit messen die diese Durchläufe brauchen.
Dann stellt sich oft schon heraus dass es bereits ohne Optimierung schon schnell genug ist, selbst 0,1 Sekunden Laufzeit sind an sich schon kaum spürbar und wenn man da noch 10% rausholt merkt das erst recht niemand mehr.
Dann hat sich die Frage nach sinnvoller Optimierung manchmal schnell erledigt 😃

Edit:
seltsam warum steht das jetzt hier dran? sollte eigentlich unter die Frage ob man Objekte lieber neu erstellt oder wiederverwendet.