[C#]Ticks en tijd (timespan)

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een performance test script.
Dit script doet een aantal acties en per actie kijk ik hoe lang dat duurde met
C#:
1
System.Diagnostics.Stopwatch

Ik log de tijd in een logfile met:
C#:
1
2
3
4
5
6
7
private static string getElapsedTime(System.Diagnostics.Stopwatch stopWatch)
{
    TimeSpan ts = stopWatch.Elapsed;
    return String.Format("{0:00}:{1:00}:{2:00}.{3:00} ({4})",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds, stopWatch.ElapsedTicks);
}

De ticks sla ik ook nog even op in een dictionary wegens een andere reden (offtopic).
Helemaal aan het einde van mijn script wil ik de ticks in mijn dictionary ook loggen en omzetten naar minuten/seconden:
C#:
1
2
3
4
5
6
7
8
9
10
private static void dumpDictionary()
{
    foreach (KeyValuePair<string, long> kvp in elapsedTicksDictionary)
    {
        TimeSpan elapsedSpan = new TimeSpan(kvp.Value);
        of1.WriteLine(string.Format("{0}; {1}; {2:00}:{3:00}:{4:00}.{5}",
            kvp.Key, kvp.Value, elapsedSpan.Hours, elapsedSpan.Minutes, 
               elapsedSpan.Seconds, elapsedSpan.Milliseconds));
    }
}


Nu blijkt dat ondanks dat het aantal ticks gelijk is, ik een verschillende tijdsduur krijg.
Bijv. in mijn logfile staat:
9236362 ticks is 00:00:02.58 (getElapsedTime)
en
9236362 ticks 00:00:00.92 (dumpDictionary)

1 van de beide functies is dus niet goed, maar ik kom er niet uit welke. Via Google vind ik dezelfde voorbeelden.
Ik sla juist ticks op in de dictionary omdat het een long is en ik er makkelijker andere ticks bij kan optellen. Is het misschien beter om gelijk de totale seconden op te slaan?

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wat geeft
C#:
1
TimeSpan ts = new TimeSpan(9236362);

terug?

In de code zie ik ook niet dat je de stopwatch stopt? Kan het dan toevallig zijn dat Stopwatch.ElapsedTicks meerdere keren worden aangeroepen en dat tussen deze twee aanroepen nog 1,5 seconden zit?

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
9236362 geeft 00:00:00,923 terug, wat volgens mij niet goed is.
Ik heb inmiddels mijn code aangepast door niet langer de ticks te bewaren maar TotalMilliseconds. Dat lijkt beter te gaan.
Ik ben nu het script weer aan het draaien om te kijken of het optellen nu wel goed gaat.
De nieuwe code wordt nu:
C#:
1
2
3
4
5
6
7
8
9
private static void dumpDictionary()
{
    foreach (KeyValuePair<string, double> kvp in elapsedTicksDictionary)
    {
        TimeSpan ts = TimeSpan.FromMilliseconds(kvp.Value);
        of1.WriteLine(string.Format("{0}; {1};{2:00}:{3:00}:{4:00},{5}",
            kvp.Key, kvp.Value, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds));
    }
}


Overigens doe ik voor het loggen stopWatch.Stop();, zodat er niet door geteld wordt.
Voor elke actie doe ik stopWatch = System.Diagnostics.Stopwatch.StartNew();

[ Voor 10% gewijzigd door Verwijderd op 04-08-2009 15:30 . Reden: stopWatch spul ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
Ik vermoed dat ticks bij de Stopwatch niet dezelfde ticks zijn als bij TimeSpan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
farlane schreef op dinsdag 04 augustus 2009 @ 16:17:
Ik vermoed dat ticks bij de Stopwatch niet dezelfde ticks zijn als bij TimeSpan.
Dat verklaart een hoop.

Inmiddels heb ik het werkende met de milliseconds. Bedankt voor het meedenken.

Acties:
  • 0 Henk 'm!

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Verwijderd schreef op dinsdag 04 augustus 2009 @ 15:28:
9236362 geeft 00:00:00,923 terug, wat volgens mij niet goed is.
Met dit

C#:
1
TimeSpan ts = new TimeSpan(9236362);


krijg je inderdaad 923ms terug want de parameter is het aantal 100-nanoseconden en dus niet het aantal milliseconden. Dit kan je beter doen:

C#:
1
TimeSpan ts = TimeSpan.FromMilliseconds(9236362);


Dan klopt het wel wat je verwacht: de uitkomst is dan 02:33:56.362. :)

Verder is geen verschil tussen de TimeSpan en Timspan van de stopwatch: beide zijn gewoon het type TimeSpan.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:02
robertpNL schreef op woensdag 05 augustus 2009 @ 11:39:
Verder is geen verschil tussen de TimeSpan en Timspan van de stopwatch: beide zijn gewoon het type TimeSpan.
Daar doelde ik ook niet op, ik had het over de ticks die bij de gebruikte TimeSpan constructor 100nS intervals zijn ( http://msdn.microsoft.com/en-us/library/zz841zbz.aspx ). De ticks die de TS opslaat zijn dat waarschijnlijk niet ( http://msdn.microsoft.com...opwatch.elapsedticks.aspx )


[edit]
Het staat zelfs expliciet vermeld:
Stopwatch ticks are different from DateTime.Ticks . Each tick in the DateTime.Ticks value represents one 100-nanosecond interval. Each tick in the ElapsedTicks value represents the time interval equal to 1 second divided by the Frequency.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1