Zeitmessung mit _ftime

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kompilierzeit mit _ftime

Beitrag von nufan » Mi Sep 24, 2008 5:52 pm

Kerli hat geschrieben:Ist die Differenz vielleicht so klein, dass es keinen Unterschied in dieser Größe gibt? ms sind für ein Konsolenprogramm schon eine sehr große Einheit. Vielleicht solltest du einmal schauen was sich ändert wenn du deine Abfrage öfters durchführst und diese Zeit stoppst.
Noch kleiner? Dann werd ich die ms als Kommazahl übergeben.
Kerli hat geschrieben:Du darfst dabei halt nicht auf die Sekunden vergessen, falls es zu lang wird...
Das ist das nächste Problem... aber ich hab jetzt für den Selectsort nur 5 Zahlen vordefiniert (also ohne Eingabe). Bin schon froh, wenn nicht 0 rauskommt ^^

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Kompilierzeit mit _ftime

Beitrag von fat-lobyte » Mi Sep 24, 2008 6:16 pm

nufan hat geschrieben:
Kerli hat geschrieben:Weshalb _soll_ es _ftime sein?
Weil es Teil der Angabe zum Beispiel ist.
Ich habs jetzt mit ms-Subtrahieren versucht, da kommt immer 0 raus...
Das kommt daher, dass moderne Computer halt doch ZIEMLICH schnell sind. Verdopple die größe deines Arrays, und zwar solange bis du einen Signifikanten wert hast.
Falls du übrigens "benchmarken" willst, würde ich Linux verwenden, und zwar so:

mit den höchsten Optimization flags kompilieren, die es gibt (-O3).
Linux im Single- user mode starten und unnötige Programme stoppen (sodass möglichst wenig andere Programme laufen).
Ruf das Programm "time" auf, mit deinem Programm als Parameter, und merk dir deine Ergebnisse (oder speichere sie ab). Wiederhole das ein paar (hundert?) mal.

Die Absolute Zeit, wie shcnell ein Programm abläuft ist irrelevant - nur der vergleich mit anderen Algorithmen ist signifikant.
Haters gonna hate, potatoes gonna potate.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kompilierzeit mit _ftime

Beitrag von nufan » Mi Sep 24, 2008 6:28 pm

fat-lobyte hat geschrieben:Das kommt daher, dass moderne Computer halt doch ZIEMLICH schnell sind. Verdopple die größe deines Arrays, und zwar solange bis du einen Signifikanten wert hast.
Mag sein, aber ich glaube, dass es nicht an dem liegt...
==> Ich habs gleich mal mit nem 1000er-Array versucht, dem in einer Schleife Werte (1000, 999, 998, ... 1) zugewiesen werden. Und das Ergebnis ist noch immer 0. :cry:
Gebe ich die Zahlen manuell per scanf ein, kommt ein anderer Wert (so zwischen -700 und 800). Da hab ich dann auch wieder das Problem mit den ganzen Sekundne.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Kompilierzeit mit _ftime

Beitrag von fat-lobyte » Mi Sep 24, 2008 6:58 pm

nufan hat geschrieben:
fat-lobyte hat geschrieben:Das kommt daher, dass moderne Computer halt doch ZIEMLICH schnell sind. Verdopple die größe deines Arrays, und zwar solange bis du einen Signifikanten wert hast.
Mag sein, aber ich glaube, dass es nicht an dem liegt...
==> Ich habs gleich mal mit nem 1000er-Array versucht, dem in einer Schleife Werte (1000, 999, 998, ... 1) zugewiesen werden. Und das Ergebnis ist noch immer 0. :cry:
Gebe ich die Zahlen manuell per scanf ein, kommt ein anderer Wert (so zwischen -700 und 800). Da hab ich dann auch wieder das Problem mit den ganzen Sekundne.

Bitte nochmal lesen:
fat-lobyte hat geschrieben:Das kommt daher, dass moderne Computer halt doch ZIEMLICH schnell sind. Verdopple die größe deines Arrays, und zwar solange bis du einen Signifikanten wert hast.
1000 sind für einen Computer ein klacks. Versuche es mit 1024. Ist es Null? Versuche es mit 2048. Ist es noch immer 0? Versuche es mit 4096. Noch immer Null? Versuche es mit 8192.
Mach das solange, bis es nicht 0 ist, oder bis du dir sicher bist, dass der Computer rechnet (wenn du 2-3 sekunden warten musst, und das ergebnis immer noch 0 ist, dann ist was faul).
Somit kommst du ganz sicher ganz schnell zu einer signifikanten Zeit.

Zu deinem Problem mit scanf kann ich nur sagen: das ist ein Bug. Zeig mal den Code her.
Haters gonna hate, potatoes gonna potate.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kompilierzeit mit _ftime

Beitrag von nufan » Mi Sep 24, 2008 7:07 pm

fat-lobyte hat geschrieben:1000 sind für einen Computer ein klacks. Versuche es mit 1024. Ist es Null? Versuche es mit 2048. Ist es noch immer 0? Versuche es mit 4096. Noch immer Null? Versuche es mit 8192.
Mach das solange, bis es nicht 0 ist, oder bis du dir sicher bist, dass der Computer rechnet (wenn du 2-3 sekunden warten musst, und das ergebnis immer noch 0 ist, dann ist was faul).
Somit kommst du ganz sicher ganz schnell zu einer signifikanten Zeit.
Ok... 100.000 und noch immer 0.
Die beiden Zeiten (also die vom Anfang und die vom Ende) sind am Ende gleich.
fat-lobyte hat geschrieben:Zu deinem Problem mit scanf kann ich nur sagen: das ist ein Bug. Zeig mal den Code her.
Ich denke nur main ist relevant, kopier aber mal alles rein:

Code: Alles auswählen

#include <sys\types.h>
#include <sys\timeb.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>

#define ANZ 100000

void eingabe (int x[ANZ], int *len);
void sort (int x[ANZ], int len);
void swap (int *x, int *y);

int main ()
{

  int x[ANZ], len=0;
  unsigned int milli1, milli2, diff;

  struct timeb timebuffer;

  ftime(&timebuffer);
  milli1=timebuffer.millitm;

  for (int i=100000; i<0; i--)
    x[i]=i;

  //eingabe (x, &len);

  sort (x, len);

  ftime(&timebuffer);
  milli2=timebuffer.millitm;

  diff=milli2-milli1;

  printf ("\n\n\nZeit: %hu ms, 1: %hu, 2: %hu", diff, milli1, milli2);

  getch ();
  return 0;

}


void eingabe (int x[ANZ], int *len)
{

  int i;

  for (i=0; i<ANZ; i++)
  {

    printf ("%d. Eingabe: ", i+1);
    scanf ("%d", &x[i]);

    (*len)++;

  }

}


void sort (int x[ANZ], int len)
{

  int i, j, min, indmin;

  for (i=0; i<len-1; ++i)
  {

    min=x[i];
    indmin=i;

    for (j=i+1; j<len; ++j)
    {

      if (x[j]<min)
      {
        min=x[j];
        indmin=j;
      }

    }

    swap(&x[i], &x[indmin]);

  }

}


void swap (int *x, int *y)
{

  int help;

  help=*x;
  *x=*y;
  *y=help;

}
HINWEISE:
"eingabe" hab ich mal als Kommentar gesetzt, da ich die Werte gleich oben in der Schleife zuweise.
Von diesem Programm sind nur "main" und "eingabe" von mir. Alles andere ist bereits vorgegeben.

Lg

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Kompilierzeit mit _ftime

Beitrag von nufan » Mi Sep 24, 2008 9:02 pm

Sorry, hab vergessn conio.h rauszunehmen :oops: In diesem Fall ist der Header nämlich wirklich unnötig.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Kompilierzeit mit _ftime

Beitrag von fat-lobyte » Do Sep 25, 2008 8:24 am

Also gleich mal vorweg: ich weiß nicht, wieso dein Compiler das geschluckt, hat, aber das ist ziemlicher blödsinn:

Code: Alles auswählen

#include <sys\types.h>
#include <sys\timeb.h>
Was sollen denn die Backslashes?? Also erstens solltest du wissen, dass ein einfacher backslash ein ESCAPE zeichen einleitet. Bei dir warens beide mal das t, also du produzierst du escape sequenz \t, was ein Tabulator ist. das wäre so als wenn du die Datei "sys types.h" inkludieren würdest. Um einen Backslash einzufügen müsstest du "\\" verwenden.
Zweitens: Windows so ziemlich das einzige System, das Backslashes als Verzeichnistrennzeichen verwendet, also wird das auch nur von Windows compilern akzeptiert. Wenn du stattdessen slashes verwendet hättest, würde es überall funktionieren: im Standard ist festgelegt, dass der slash "/" als Verzeichnistrennzeichen von allen compilern akzeptiert werden muss, und das heißt auch unter windows.

kurz gesagt:
s/\\/\//g

Für alle nicht-freaks unter euch heißt das "ersetze alle Vorkommnisse von "\" mit "/".
nufan hat geschrieben:Gebe ich die Zahlen manuell per scanf ein, kommt ein anderer Wert (so zwischen -700 und 800). Da hab ich dann auch wieder das Problem mit den ganzen Sekundne.Lg
Was für ein Problem mit den Sekunden? Bitte drücke dich Präzise aus.

So wie ich das gesehen habe, liest scanf alle Zahlen ein!? Willst du etwa 10,000 Zahlen eingeben? Ich glaub da bist du dir selbst nicht ganz im klaren was dein Code tut.

Was genau soll eigentlich das:
nufan hat geschrieben:

Code: Alles auswählen

printf ("\n\n\nZeit: %hu ms, 1: %hu, 2: %hu", diff, milli1, milli2);
Ich weiß zwar nicht genau was "h" bedeutet, aber ich bin mir ziemlich sicher dass es nicht hierher passt:
man 3 printf hat geschrieben:A following integer conversion corresponds to a short int or
unsigned short int argument, or a following n conversion corre-
sponds to a pointer to a short int argument.
diff, milli1, milli2 sind aber keine shorts! Alles ein bisschen seltsam bei dir.


Und hier noch eine persönliche Bitte:
KANNST DU BITTE AUFHÖREN DAS ZU IGNORIERERN WAS ICH GESAGT HABE?
1000 sind zu wenig! 10,000 sind auch zuwenig!
Versuche es mit viel mehr! mit 20,000
Wenn das nicht hinhaut, versuchs mit 40,000
Irgendwann muss der Computer doch zum rechnen anfangen.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Kompilierzeit mit _ftime

Beitrag von fat-lobyte » Do Sep 25, 2008 8:48 am

Wo wird eigentlich die Variable "len" gesetzt? Ist die nicht für dafür verantwortlich,wie oft die schleife wirklich durchläuft?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Kompilierzeit mit _ftime

Beitrag von Xin » Do Sep 25, 2008 1:06 pm

fat-lobyte hat geschrieben:Also gleich mal vorweg: ich weiß nicht, wieso dein Compiler das geschluckt, hat, aber das ist ziemlicher blödsinn:

Code: Alles auswählen

#include <sys\types.h>
#include <sys\timeb.h>
Was sollen denn die Backslashes?? Also erstens solltest du wissen, dass ein einfacher backslash ein ESCAPE zeichen einleitet. Bei dir warens beide mal das t, also du produzierst du escape sequenz \t, was ein Tabulator ist. das wäre so als wenn du die Datei "sys types.h" inkludieren würdest. Um einen Backslash einzufügen müsstest du "\\" verwenden.
Das ist kein "String".

@nufan: Verwende Slashes...
fat-lobyte hat geschrieben:So wie ich das gesehen habe, liest scanf alle Zahlen ein!? Willst du etwa 10,000 Zahlen eingeben? Ich glaub da bist du dir selbst nicht ganz im klaren was dein Code tut.
Darum sind wir ja hier. ^^
fat-lobyte hat geschrieben:Und hier noch eine persönliche Bitte:
KANNST DU BITTE AUFHÖREN DAS ZU IGNORIERERN WAS ICH GESAGT HABE?
Deine Shift-Teste klemmt.
fat-lobyte hat geschrieben:1000 sind zu wenig! 10,000 sind auch zuwenig!
Versuche es mit viel mehr! mit 20,000
Wenn das nicht hinhaut, versuchs mit 40,000
Irgendwann muss der Computer doch zum rechnen anfangen.
Oder nimm einen 286er ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Zeitmessung mit _ftime

Beitrag von nufan » Do Sep 25, 2008 4:49 pm

fat-lobyte hat geschrieben:Was sollen denn die Backslashes??
Tja... so wars in dem Beispiel im Internet auch angegeben. Und viel mehr Anhaltspunkte hab ich nicht.
fat-lobyte hat geschrieben:Was für ein Problem mit den Sekunden? Bitte drücke dich Präzise aus.
Ich meinte mit den kompletten Sekunden, da die Eingabe wahrscheinlich länger als 1 Sekunde dauern wird. _ftime gibt die Zeit als String zurück. Das müsste ich dann auch noch subtrahieren. Und wenns genau 23:59.59:99 Uhr ist? Dann muss ich Stunden und Tage auch noch berücksichtigen...
fat-lobyte hat geschrieben:So wie ich das gesehen habe, liest scanf alle Zahlen ein!? Willst du etwa 10,000 Zahlen eingeben? Ich glaub da bist du dir selbst nicht ganz im klaren was dein Code tut.
Ich hab doch schon geschrieben, dass ich die ganze Funktion "eingabe" als Kommentar gesetzt habe, da ich die Werte schon in der Schleife zuweise.
fat-lobyte hat geschrieben:Was genau soll eigentlich das:
nufan hat geschrieben:

Code: Alles auswählen

printf ("\n\n\nZeit: %hu ms, 1: %hu, 2: %hu", diff, milli1, milli2);
Es "sollte" die benötigte Zeit in Millisekunden und den 1. und den 2. Zeitwert ausgeben.
fat-lobyte hat geschrieben:diff, milli1, milli2 sind aber keine shorts! Alles ein bisschen seltsam bei dir.
Stimmt. Ein Fehler weniger.
fat-lobyte hat geschrieben:KANNST DU BITTE AUFHÖREN DAS ZU IGNORIERERN WAS ICH GESAGT HABE?
1000 sind zu wenig! 10,000 sind auch zuwenig!
Versuche es mit viel mehr! mit 20,000
Wenn das nicht hinhaut, versuchs mit 40,000
Ähmm... ich glaube diesmal beschuldigst du mich zu unrecht. Nochmal mit Tausenderpunkt: ANZ ist nicht 10.000 sondern 100.000! Ich habs schon mit 300.000 versucht, aber dann hat der integer in der Schleife nicht mehr mitgemacht ;)
fat-lobyte hat geschrieben:Wo wird eigentlich die Variable "len" gesetzt? Ist die nicht für dafür verantwortlich,wie oft die schleife wirklich durchläuft?
!!!
Hab den Wert jetzt mal auf 100.000 gesetzt und bekomm eine Differenz von 158 ms! Aber eigentlich sollte ja auch schon die Zuweisung in der Schleife einen messbaren Unterschied machen, oder? Die Berechnung dauert jetzt ca 5 Sekunden. Jetzt muss ich die auch noch berechnen.
fat-lobyte hat geschrieben:Irgendwann muss der Computer doch zum rechnen anfangen.
Ich denke, dass eher bei der Berechnung der 2. Zeit was nicht stimmt. Das Programm macht derzeit nichts, außer einem 100.000er Array Werte von 100.000 bis 1 zuzuweisen, vorher und nachher die Zeit auszulesen, die Werte zu subtrahieren und ausgeben.
Xin hat geschrieben:Oder nimm einen 286er ^^
Gleich bei Ebay gucken :D

Antworten