Seite 1 von 1

[gelöst] int time.elapsed() to int?

Verfasst: 12. April 2010 18:29
von 24dan
laut docu sollte time.elapsed() mir die vergangen Zeit als int-Wert auswerfen oder habe ich was überlesen und falsch verstanden?

Code: Alles auswählen

QTime time;
time.start();

int i;
i = time.elapsed();
gibt nur 0

Verfasst: 12. April 2010 18:58
von franzf
Das elapsed ist doch direkt der nächste Aufrufnach dem start, da kann es durchaus möglich sein, dass noch keine Zeit vergangen ist. Du hast nen Prozessor im Gigahertzbereich, dein Arbeitsspeicher läuft minimum im Megahertzbereich. Da sind millisekunden einfach zu grob :P

Mach doch dazwischen ein qSleep(), dann wirst du time.elapsed() > 0 erhalten.

Verfasst: 12. April 2010 19:26
von 24dan
Also bitte, ich bin unwissend faul, müde, unlustig, langweilig, eben ein nerd aber doch nicht doof.....
:shock:

Das war doch nur ein bsp natürlich mache ich nicht gleich danach elapsed(),
:wink:
es geht einfach nicht.... :cry:

ein qDebug() << time.elapsed(); gibt mir zum gleichen Zeitpunkt 16ms raus....

Verfasst: 12. April 2010 19:47
von franzf
Dann poste bitte Beispielcode, mit dem man dein Problem nachvollziehen kann. So kann man nämlich überhaupt nichts sagen.

Verfasst: 12. April 2010 21:57
von 24dan
Also der Source ist ganz sicher unverständlich aber er zeigt wie ich QTime verwende...

Code: Alles auswählen

TEIL * Auswertung::objekteFuellen( TEIL *anf_TEXT)
{
   TEIL *anf_ABSATZ = new TEIL;
   TEIL *anf_SATZ   = new TEIL;
   TEIL *anf_WORT   = new TEIL;
   TEIL *anf_BST    = new TEIL;
   unsigned long i_owb = 1;
QTime time;
   time.start();
   
   QString text = this->qs_text;
   text.replace(". ", ".");
   text.replace(".# ","#");
   text.simplified();
   QStringList l_absaetze = text.split("#",QString::SkipEmptyParts);
   anf_TEXT->l_text = l_absaetze;
   foreach(QString qs_absaetze, l_absaetze) {
       qs_absaetze.trimmed();
       QStringList l_saetze = qs_absaetze.split(".", QString::SkipEmptyParts);
       this->absaetze.append(l_saetze);
       foreach(QString qs_saetze, l_saetze){
           qs_saetze.trimmed();
           QStringList l_worte = qs_saetze.split(" ", QString::SkipEmptyParts);
           foreach(QString qs_wort, l_worte){
               qs_wort.trimmed();
               for(int i = 0; i<qs_wort.length();i++){
                   QChar c_bst = qs_wort[i];
                   TEIL *BST = new TEIL;
                   i_owb = BST->kodieren(c_bst, i_owb);
                   anf_BST = BST->setNext(anf_BST, BST);
               }
               TEIL *WORT = new TEIL;
               anf_BST->aufAddieren(WORT);
               WORT->setFirst(WORT, anf_BST->next);
               anf_WORT = WORT->setNext(anf_WORT, WORT);
               WORT->setNULL(anf_BST);
           }
           TEIL *SATZ = new TEIL;
           anf_WORT->aufAddieren(SATZ);
           SATZ->setFirst(SATZ, anf_WORT->next);
           anf_SATZ = SATZ->setNext(anf_SATZ, SATZ);
           SATZ->setNULL(anf_WORT);
           i_owb = 1; 
       }
       TEIL *ABSATZ = new TEIL;
       anf_SATZ->aufAddieren(ABSATZ);
       ABSATZ->setFirst(ABSATZ, anf_SATZ->next);
       anf_ABSATZ = ABSATZ->setNext(anf_ABSATZ, ABSATZ);
       ABSATZ->setNULL(anf_SATZ);
   }
   anf_ABSATZ->aufAddieren(anf_TEXT);
   anf_TEXT->setFirst(anf_TEXT, anf_ABSATZ->next);


   int z;
   z = time.elapsed();

   qDebug()<<z;

   qDebug("Daten kodiert: %dms", time.elapsed());
   return (anf_TEXT);
}
:roll:

Also kann das sein das die gleiche Aufgabe mal im 16ms und dann wieder in weniger als 1 ms erledigt ist? Oder benutze ich QTime falsch. Ich bekomme selbt bei einer "längeren" Aufgabe (31ms) sowhl mal weniger als 1ms und dann wieder 31ms.
Der int Wert wird wohl richtig geschrieben.
Es muss mit QTime etwas nicht ganz funktionieren
Ausgabe des Programms:
  • 31
    Daten kodiert: 31ms
und dann auch mal:
  • 0
    Daten kodiert: 0ms
Windows ? Echtzeit ? Zeitmessungsproblem ? :?

Verfasst: 13. April 2010 00:00
von kater
Millisekunden kann man eh nicht genau messen. Außer man betreibt mehr Aufwand. Und ja das kann sein, dass die selbe Aufgabe in weniger Zeit gerechnet wird. Wenn der Prozessor weniger ausgelastet ist oder die Daten schon im CPU Cache liegen und nicht erst aus dem RAM geladen werden müssen.

Verfasst: 14. April 2010 14:32
von Troll.Soft
Hallo Dan,
denkst Du auch daran, das ein Timer die reale Zeit mißt, also die Zeit, die auch auf Deinem Schreibtisch vergeht. Dein Prozess kann stillstehen, wärend ein anderer Prozess die CPU beansprucht. Laß Deinen Code in einer Schleife 1000mal laufen. Das Ergebnis sollte aussagekräftiger sein. Falls immer noch abwechselnd 0 oder 16 Sekunden rauskommen, mußt Du wohl oder übel einen Kobold in Deinem System vertreiben :)
tschüß
Troll.Soft

Verfasst: 14. April 2010 15:34
von Exasperation
24dan hat geschrieben: Also kann das sein das die gleiche Aufgabe mal im 16ms und dann wieder in weniger als 1 ms erledigt ist? Oder benutze ich QTime falsch. Ich bekomme selbt bei einer "längeren" Aufgabe (31ms) sowhl mal weniger als 1ms und dann wieder 31ms.
Der int Wert wird wohl richtig geschrieben.
Es muss mit QTime etwas nicht ganz funktionieren
Ausgabe des Programms:
  • 31
    Daten kodiert: 31ms
und dann auch mal:
  • 0
    Daten kodiert: 0ms
Windows ? Echtzeit ? Zeitmessungsproblem ? :?
Windows macht bei der Zeit sehr grobe Rundungen, bzw. misst in zu groben Abständen... Es kann sein, dass die Berechnung zB 15 ms gedauert hat, dann werden aber trotzdem 0 ms angezeigt. Bei 16 ms oder mehr werden dann auch 16 ms angezeigt. Wetten du bekommst keine anderen werte als 16 oder 31 ms raus? ;)

Verfasst: 15. April 2010 22:37
von 24dan
Exasperation hat geschrieben: Wetten du bekommst keine anderen werte als 16 oder 31 ms raus? ;)
Hee ja ist tatsächlich verdächtig häufig 31 und 16 sonst nix, bei annähend gleicher Aufgabe die vom Programm zu leisten ist. :roll: