[erledigt] Laufzeit von (C-) Codestücken ermitteln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
GregorS
Beiträge: 3133
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

[erledigt] Laufzeit von (C-) Codestücken ermitteln

Beitrag von GregorS » 21.08.2014 01:53:14

Hallo allerseits!

Ich möchte die Laufzeit eines Codeteiles ermitteln. Der Blick auf <ctime> bzw. <time.h> hat ergeben, dass man damit wohl nur Zeiten in Sekunden (aber keinen Bruchteilen davon) ermitteln kann. Bei Code, der vielleicht 1/1000 Sekunde läuft, hilft das verständlicherweise überhaupt nicht.

Gibt es eine Möglichkeit, eine Laufzeit in Takten oder so zu ermitteln?

Etwa so:

Code: Alles auswählen

cout << startzeit;
  // Code, der getestet wird
cout << endzeit;
Die Differenz ist dann die Laufzeit.

Die Frage kommt mir irgendwie blöd vor, weil sie wahrscheinlich schon hundertmal beantwortet wurde. Nur scheine ich nicht auf die richtigen Suchbegriffe zu kommen, denn die Ergebnisse aus dem Netz waren allesamt nicht hilfreich.

Vielen Dank vorweg

Gregor

Ergänzung: Die Frage hat sich erledigt. Ich bin auf diversen Code gestoßen, den ich auf die Schnelle zusammengefrickelt habe:

Code: Alles auswählen


// main.cc

#include "main.hh"

#include <iostream>
#include <cstdlib>
#include <sys/timeb.h>
#include <stdio.h>

using namespace std;

int getMilliCount(){
  timeb tb;
  ftime(&tb);
  int nCount = tb.millitm + (tb.time & 0xfffff) * 1000;
  return nCount;
}

int getMilliSpan(int nTimeStart){
  int nSpan = getMilliCount() - nTimeStart;
  if(nSpan < 0)
    nSpan += 0x100000 * 1000;
  return nSpan;
}

int main(){
  cout << "Methode 1:\n" << endl;

  printf("Starting timer...\n");
  int start = getMilliCount();

  // CODE YOU WANT TO TIME
  for(int i = 0; i < 1000000; i++)
    {
      int a = 55/16;
      a++;
    }

  int milliSecondsElapsed = getMilliSpan(start);

  printf("Elapsed time = %u milliseconds\n\n", milliSecondsElapsed);


  cout << "Methode 2:\n" << endl;

  clock_t Start = clock();

  for(int i = 0; i < 1000000; i++)
    {
      int a = 55/16;
      a++;
    }

  cout << "Time Difference: " << clock() - Start << endl;

  return 1;
}

// eof

Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: [erledigt] Laufzeit von (C-) Codestücken ermitteln

Beitrag von Cae » 21.08.2014 04:23:57

Wenn's nicht um absolute Werte, sondern um den Vergleich von zwei Code-Stuecken geht, kann ich callgrind aus Debianvalgrind in Kombination mit Debiankcachegrind (zur Anzeige/Auswertung) empfehlen. Da wird der Maschinencode in einer virtuellen CPU ausgefuehrt, was genaue Betrachtungen wie "der Teil braucht n Instruktionen" ermoeglicht. Auf einer tieferen Ebene koennte man Debianstrace bzw. Debianltrace mit -T verwenden, um die Wartezeit auf System- bzw. Library-Calls zu bestimmen. Noch simpler waere time(1) (Achtung, die Bash bringt ein gleichnamiges Builtin mit, daher als /usr/bin/time aufrufen), womit man aber auch deutlich weniger Informationen erhaelt.

Alle von mir genannten Moeglichkeiten nehmen die Binary und den Quellcode (bei callgrind ist's nuetzlich) ohne Aenderungen. Alternativ kann man sich natuerlich den Code in einen zeitmessenden Wrapper stecken, der dann gettimeofday(2) (Microsekunden-Genauigkeit) oder ftime(3) (nur Millisekunden-Genauigkeit) verwendet. Mit clock_gettime(2) koennte man sogar Nanosekunden aufloesen (sofern die Hardware das kann).

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: [erledigt] Laufzeit von (C-) Codestücken ermitteln

Beitrag von cosmac » 21.08.2014 09:26:25

clock_gettime hat noch den Vorteil, dass man die CPU-Zeit (nicht Uhrzeit) abfragen kann, die der eigene Prozess oder Thread gebraucht hat. Es sollte also auch dann noch halbwegs genau sein, wenn der Rechner ausgelastet ist. Wer mehrere CPUs hat, sollte den Prozess sicherheitshalber an einen Kern binden, siehe taskset(1) oder sched_setaffinity(2).
Beware of programmers who carry screwdrivers.

Antworten