ubuntuusers.de

Java: Zeit messen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Bratwurstler

Avatar von Bratwurstler

Anmeldungsdatum:
14. Oktober 2007

Beiträge: 146

Wohnort: Berlin

Hey,

ich habe hier eine Methode, die alle paar Sekunden aufgerufen wird. Und diesen Zeitabstand soll sie messen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    private long time_start_ms;
    private long time_avg_ms;

    void prepareNewQuestion() {
        currentQuestion = new Question(this);
        if (time_avg_ms > 0)
        {
            time_avg_ms = (time_avg_ms + (System.currentTimeMillis() - time_start_ms)) / 2;
        }
        else
        {
            time_avg_ms = (System.currentTimeMillis() - time_start_ms);
        }
        time_start_ms = System.currentTimeMillis();
        System.out.println("Durchschnittszeit: " + (time_avg_ms /1000) + "s");
    }

Da kommen keine sinnvollen Werte raus und ich befürchte, ich mache was grundlegend falsch. Mag mir jemand n Tipp geben? =)

Jens

bananabear

Anmeldungsdatum:
21. Januar 2007

Beiträge: 58

Wohnort: Homburg

moin moin...

so wie ich das seh übergibst du der variable time_start_ms ja erst die aktuelle Zeit nachdem du dein if-else-konstrukt durchlaufen hast.. somit ist time_start_ms bei der berechnung noch 0...

Versuchs mal.. wenn du die zeile 14 aus deinem code direkt an den anfang der methode setzt sollten die werte passen...

viele grüße, sven

Bratwurstler

(Themenstarter)
Avatar von Bratwurstler

Anmeldungsdatum:
14. Oktober 2007

Beiträge: 146

Wohnort: Berlin

Hm nee so wirds immer null, weil die Klammer in Zeile 8+12 dann immer null is...

Steh grad aufm Schlauch =S

Edit: momentane ausgabe, wenn die alle 3-4 sec aufgerufen wird:

run:
Durchschnittszeit: 1245654620
Durchschnittszeit: 622827312
Durchschnittszeit: 311413660

wird immer halbiert... mh

bananabear

Anmeldungsdatum:
21. Januar 2007

Beiträge: 58

Wohnort: Homburg

ach gott klar... der kaffee wirkt noch nicht... ^^

wär praktisch zu wissen was raus kommt und was du denkst was rauskommen sollte 😉

//edit ich schau später nochmal rein wenn ich wieder zeit hab ... bin grad auch etwas verwirrt Oo

sry für die vorest ausbleibende hilfe 😉

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@Bratwurstler: Du berechnest immer die Zeit zwischen zwei Aufrufen, nur beim ersten mal ist time_start_ms noch Null, und damit geht die Zeit zwischen "keinem" Aufruf und dem ersten Aufruf als ca. 39 Jahre in die Rechnung mit ein. Und da die folgenden Zeitspannen dagegen so verschwindend klein sind, halbiert sich der Durchnschitt bei jedem weiteren Aufruf fast.

bananabear

Anmeldungsdatum:
21. Januar 2007

Beiträge: 58

Wohnort: Homburg

war doch einer schlauer um die zeit ☺

ich hab nur soweit gedacht dass er die variablie an sich nicht initialisiert... dass das in 39 bis zum start der unix-uhr zurück geht war mir vorhin zu hoch ...

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Den Durchschnitt kann man so aber auch nicht berechnen, wenn die Startzeit stimmt.

Angenommen die Zeit schwankt um 7 sek., ist immer 7-n gefolgt von 7+n, (nur zu Beginn wird nicht +last / 2 gerechnet):

nr Messung Sum avg last+msg (last + msg)/2
1 6 6 6 - 6
2 8 14 7 14 7
3 6 20 6,33 13 6,5
4 8 28 7 14,5 7,25
5 0 28 5,6 7,25 3,625
6 14 42 7 17,625 8,8...

Du mußt schon die Gesamtsumme und die Gesamtzahl mitschleppen, sonst gewichtest Du die letzte Messung immer mit 50%, und die erste Messung umso kleiner, je mehr Messungen stattfanden.

Bratwurstler

(Themenstarter)
Avatar von Bratwurstler

Anmeldungsdatum:
14. Oktober 2007

Beiträge: 146

Wohnort: Berlin

Hui vielen Dank für die Hilfe!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    void prepareNewQuestion() {
        currentQuestion = new Question(this);
        if ((correctAnswersCount + falseAnswersCount) > 0)
            time_sum_ms += System.currentTimeMillis() - time_start_ms;
        time_start_ms = System.currentTimeMillis();
    }
    
    int getAverageTimeSeconds()
    {
        if ((correctAnswersCount + falseAnswersCount) == 0)
            return 0;
        return (int) (time_sum_ms / (correctAnswersCount + falseAnswersCount) / 1000);
    }

Scheint zu funktionieren ☺

Jens

Antworten |