Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dauer eines Schleifendurchlaufs berechnen
snsewill
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

Dauer eines Schleifendurchlaufs berechnen

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Sourcerer
myCSharp.de - Member



Dabei seit:
Beiträge: 9
Herkunft: Bayern

beantworten | zitieren | melden

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!!!
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
snsewill
myCSharp.de - Member



Dabei seit:
Beiträge: 18

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.826

beantworten | zitieren | melden

Nichts anderes als die programmatische 3-Satz-Variante.
PS: Schleifen mit innen-liegenden Berechnungen lassen sich in der Regel effizient parallelisieren.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.764
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
Attachments
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Moderationshinweis von herbivore (31.10.2013 - 19:29)

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.

private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.105

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am .
private Nachricht | Beiträge des Benutzers