Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

21

03.03.2013, 18:09

Ehm, mit dem Programm misst du die Zeit für die Konsolenausgabe.

Edit: (Hier war doch nichts falsch oder? *hust*)
Wenn ich das ganze ohne Ausgabe über eine hohe Auflösung mache und am Ende ausgebe komme ich auf ca 800 ys. Also wie BlueCobold geschrieben hat.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void Main(string[] Args)
        {
            DateTime LastValue = DateTime.Now;
            Stopwatch Watch = new Stopwatch();
            Watch.Reset();
            Watch.Start();
            double t = 0;
            int res = 100000;
            int rres = 0;
            for (int i = 0; i < res; ++i)
            {
                DateTime NewValue = DateTime.Now;
                if (NewValue != LastValue)
                {
                    ++rres;
                    t += Watch.Elapsed.TotalMilliseconds;

                    Watch.Reset();
                    Watch.Start();
                    
                    LastValue = NewValue;
                }
            }
            double t2 = t / rres;
            Console.WriteLine(t2.ToString() + "ms");
        }
Ich hoffe ich hab grad keinen Denkfehler rein gebracht, aber es bestätigt in etwa die Monoausgabe (Unter Linux funktioniert die Ausgabe etwas anders, deswegen das Ergebnis)
:love: := Go;

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »H5::« (03.03.2013, 18:40)


daG

Treue Seele

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

22

03.03.2013, 18:27

Ja, das wird mitberechnet. Das ist natürlich falsch. Ich habe die Version mal angepasst.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void Main(String[] args)
{
    var oldValue = DateTime.Now;
    var newValue = oldValue;

    var counter = 0;
    var elapsed = 0L;

    var stopwatch = Stopwatch.StartNew();

    while (counter < 100)
    {
        newValue = DateTime.Now;

        if (newValue != oldValue)
        {
            counter += 1;
            elapsed += stopwatch.ElapsedMilliseconds;

            stopwatch.Restart();

            oldValue = DateTime.Now;
        }
    }

    Console.WriteLine("{0}ms", elapsed / (Single)counter);
    Console.ReadKey();
}


Das Ergebnis ist trotzdem ~15ms unter Windows 7

daG

Treue Seele

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

23

03.03.2013, 18:33

Doch, ich denke du hast einen Denkfehler. Du kannst nicht durch res teilen, da du durch die Bedingung nicht jeden Durchlauf die MS dazu rechnest.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

24

03.03.2013, 18:36

Ah, verd... *Memo an selbst* Immer selbst schreiben nie verändern!

Edit:
Ich war mal so frech es oben richtig(er) zu machen. Ich komme aber wie gesagt auch auf die von BlueCobold besagten Werte. Ich konnte soweit im Netzt bisher nichts auf die Schnelle finden, aber kann es sein, dass sich mit den Timern auf x64 Systemen etwas geändert hat? Die sind ja zunehmender verbreiteter. Und deswegen auch so viele unterschiedliche Aussagen zu finden sind.
:love: := Go;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »H5::« (03.03.2013, 18:53)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

25

03.03.2013, 18:41

Super, lauter verschiedene Ergebnisse.
Bei mir unter Win7 kommt übrigens folgendes raus bei Spiele Programmierers Programm:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0,8006ms
0,8898ms
0,8578ms
2,4649ms
0,0101ms
0,239ms
0,0101ms
0,0093ms
0,282ms
0,9064ms
0,0081ms
0,0028ms
0,0089ms
0,0105ms
0,4696ms
0,5737ms
0,0081ms
0,6989ms
0,8776ms
0,9433ms
0,9226ms
0,1827ms
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

26

03.03.2013, 19:40

Zitat

Ehm, mit dem Programm misst du die Zeit für die Konsolenausgabe.

Unter Mono auf Linux scheint das so zu sein.
Bei den Zeiten im Millisekundenbereich um die es hier geht ist das vernachlässigbar.
Wenn ich nur die Konsolenausgabe messe komme ich in etwas auf die Werte von daG auf Linux mit Mono.

Zitat

Wenn ich das ganze ohne Ausgabe über eine hohe Auflösung mache und am Ende ausgebe komme ich auf ca 800 ys. Also wie BlueCobold geschrieben hat.

Wenn man falsch misst, dann kann man alles rausbekommen.
800ys sind übrigens absolut unmöglich.

Abschliessend kann man also sehen das die Genauigkeit mit dem Betriebssystem stark variiert.
Das die Zeiten ausreichend genau sind, ist mehr oder weniger Zufall. Bei unter 1ms würde es in der Praxis zwar meistens ausreichen, aber eben reichen sie weder immer aus, noch ist diese Präzision garantiert. Die Uhrzeit auf die Millisekunde ist nunmal in der Regel nicht sinnvoll und deshalb nicht immer verfügbar.
Wenn interessiert schon das jetzt genau 8:32 und 45,898 Sekunden ist? Das hingegen 89,783 Sekunden vergangen sind, ist häufiger von Bedeutung.
Ich persönlich sehe das einfach so das es für den Zweck die falsche Methode ist, wobei das wahrscheinlich ansichtssache ist.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

27

03.03.2013, 19:49

Nun, dennoch hat H5:: Recht.
Dein Programm misst die Dauer der Konsolen-Ausgabe. Du kannst die Werte ja mal in einen Array fester Größe (keine Liste) reindonnern und danach ausgeben lassen. Da sieht es gleich ganz anders aus, da werden die Differenzen nämlich noch kleiner.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

28

03.03.2013, 20:10

Darin hat er recht, aber die Konsolenausgabe kostet bei mir maximal etwa 0,01ms und das ist vernachlässigbar klein.
Zumindest um die "problematisch geringe" Uhrpräzision nachweisen zu können die im ms Bereich liegt. (Auf Windows)

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

29

03.03.2013, 20:23

Wenn man falsch misst, dann kann man alles rausbekommen.
800ys sind übrigens absolut unmöglich.
Also das halte ich mal für eine Unterstellung ;). Das sind 0.8ms und durchaus realistisch. Besonders wenn man den 3.19Mhz Timer nimmt der so gut wie überall verbaut ist. Und somit eine Genauigkeit von ca. 313ns ermöglicht.
Kann natürlich sein, dass dies alles falsch ist. So habe ich das mal getestet in der schnelle.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <Windows.h>
#include <mmsystem.h>

#include <exception>
#include <iostream>
#include <cstdlib>
#include <chrono>

main( int argc, char* argv[] )
    -> int
{
    using std::chrono::time_point;
    using std::chrono::high_resolution_clock;
    using std::chrono::duration_cast;
    using std::chrono::milliseconds;

    if( 2 != argc )
    {
        std::cout << "use: <app> <res>" << std::endl;
        return 0;
    }

    int res = std::atoi( argv[1] );
    size_t t0 = 0;
    size_t t1 = 0;

    // Test timeGetTime( )
    time_point<high_resolution_clock> start = high_resolution_clock::now( );
    for ( int i = 0; i < res; ++i )
    {
        t0 = t1 = timeGetTime( );
        while ( t0 == t1 )
        {
            t1 = timeGetTime( );
        }
    }
    time_point<high_resolution_clock> stop = high_resolution_clock::now( );
    auto result1 = static_cast<double>( duration_cast<milliseconds>( stop - start ).count( ) ) / res;

    // Console Test 1
    start = high_resolution_clock::now( );
    for ( int i = 0; i < res; ++i )
    {
        std::cout << "0815" << std::endl;
    }
    stop = high_resolution_clock::now( );
    auto result2 = static_cast<double>( duration_cast<milliseconds>( stop - start ).count( ) ) / res;

    // Console Test 2
    start = high_resolution_clock::now( );
    for ( int i = 0; i < res; ++i )
    {
        std::cout << "Hello World! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20" << std::endl;
    }
    stop = high_resolution_clock::now( );
    auto result3 = static_cast<double>( duration_cast<milliseconds>( stop - start ).count( ) ) / res;

    std::cout << "Result timeGetTime( ): " << result1 << "ms" << std::endl;
    std::cout << "Result Console Test 1: " << result2 << "ms" << std::endl;
    std::cout << "Result Console Test 2: " << result3 << "ms" << std::endl;

    return 0;
}


Edit:

Quellcode

1
2
3
Result timeGetTime( ): 1.001ms
Result Console Test 1: 0.444ms
Result Console Test 2: 3.61ms
:love: := Go;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »H5::« (03.03.2013, 20:32)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

03.03.2013, 20:26

Wäre schön gewesen, wenn Du auch noch ein paar Ergebnisse dazu geschrieben hättest, damit es nicht jeder erst kompilieren muss.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige