Toon posts:

[C] Functies timen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil mijn programma sneller maken. Daarvoor is het handig om te weten welke functies het langste duren. Hoe kom ik hier achter? Is er een programma wat bijhoudt hoe lang elke functie duurt?

Het programma is niet-interactief en draait op Linux.

  • Xanthus
  • Registratie: Februari 2002
  • Laatst online: 11-07 12:45
Je zou het met de standaardfuncties in <time.h> kunnen doen, met de functie time aan het begin en eind, en dan difftime.
Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
#include <time.h>
void func() {
  time_t begin, end;
  double lengte;
  time(&begin);
  voer de functie uit
  time(&end);
  lengte = difftime(begin, end);
}

Verwijderd

Verwijderd schreef op 30 April 2003 @ 20:30:Is er een programma wat bijhoudt hoe lang elke functie duurt?
Ja, dat is er, en het heet gprof.

Verwijderd

Topicstarter
Aha, het het program profiling. Daar moet ik verder mee kunnen komen, bedankt!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Met "execution time profiling" en "run-time profiling" heb je misschien ook succes.

Overigens heb ik ook goede ervaringen met gprof onder FreeBSD. Onder Linux zou het ook geen enkel probleem moeten vormen. Ik vrees dat je het wel met vrij spartaanse uitvoer moet doen, maar in de praktijk is dat niet echt een probleem: het is al vrij snel duidelijk waar bottlenecks zitten.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Profilen is idd de beste optie, maar als je geen profiler tot je beschikking hebt kun je er zelf natuurlijk ook een in elkaar zetten door aan het begin en het eind van functies een profile-functie aan te roepen die alles timed

zie ook [rml][ C/C++ VxWorks] Executietijd functie[/rml]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • nhimf
  • Registratie: September 2000
  • Laatst online: 19-08 10:00

nhimf

Lekker belangrijk allemaal

Je zoekt naar functies die lang duren, is het niet handig om ook te kijken naar de "korte" functies die juist veel worden gebruikt.
Zoals een if-statment in C wordt erg veel gebruikt, dus als je daar 0,1sec winst uithaalt, dan is dat effectiever dan dat je bij een functie die een datagrid update en daar 0,3 seconde winst behaalt.
Het is maar een idee, ik weet niet wat je doet, maar kijk dus ook even naar de snelle functies die erg vaak gebruikt worden.
Verder geen ervaring met timen overigens ;)

Ik stink niet, ik ruik gewoon anders


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

knap als je per if statement 0.1 sec winst uit kan halen ;)
Die schat ik op maximaal 10 clockcycles, op een 1 GHz cpu is dat 10 nanoseconde (dus 0.000000010 seconde) :Y)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
nhimf schreef op 01 May 2003 @ 10:19:
Je zoekt naar functies die lang duren, is het niet handig om ook te kijken naar de "korte" functies die juist veel worden gebruikt.
Zoals een if-statment in C wordt erg veel gebruikt, dus als je daar 0,1sec winst uithaalt, dan is dat effectiever dan dat je bij een functie die een datagrid update en daar 0,3 seconde winst behaalt.
Het is maar een idee, ik weet niet wat je doet, maar kijk dus ook even naar de snelle functies die erg vaak gebruikt worden.
Verder geen ervaring met timen overigens ;)
Profilers als gprof vemelden meestal de totale tijd die aan een functie gespendeerd is, samen met het aantal aanroepen (of natuurlijk een andere combinatie met de gemiddelde tijd, wat op hetzelfde neerkomt). Je kunt zo dus zien welk deel van de executietijd elke functie kost, of die nu snel is en frequent aangeroepen wordt, of zelden aangeroepen wordt maar extreem traag is.

Verder zijn er trouwens nog wel wat zaken die daar invloed bij kunnen hebben. Zo bevatten de meeste functies aanroepen van andere functies. Als die andere functies sneller worden, wordt je originele functie ook weer sneller (uiteindelijk tot aan de main method toe).

Nu we het er toch over hebben: wat zijn geschikte (memory, execution time) profiling tools voor Java (liefst gewoon de 1.4 JVM van Sun)? Niet dat ik verder al gezocht heb ofzo, maar als iemand toevallig wat weet...

[ Voor 9% gewijzigd door Soultaker op 01-05-2003 12:41 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker: veel profilers noemen naast de totale executietijd en het gemiddelde per aanroep ook nog eens de tijd dat hij echt _in_ de functie zit. Als hij dus een aanroep naar een andere functie doet stopt de counter van de huidige functie en begint ie te tellen bij de aangeroepen functie. Als die functie weer retourneert gaat ie weer verder tellen bij de aanroepende functie

Ik heb overigens geen ervaring met gprof ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Klein voorbeeldje van gprof. Zoals je ziet zijn er functies die 11 miljoen keer worden aangeroepen, en er zijn functies die erg lang duren. Beide zijn te optimaliseren.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
 14.24      2.61     2.61 11119200     0.00     0.00  parseframe
 12.77      4.95     2.34 11119200     0.00     0.00  framelength
 12.33      7.21     2.26 11119050     0.00     0.00  parse_file_stats
 10.64      9.16     1.95     1800     1.08    10.17  checkfile
  9.77     10.95     1.79 11119200     0.00     0.00  checkframe
  7.97     12.41     1.46 11119200     0.00     0.00  frametime
  6.49     13.60     1.19 11119200     0.00     0.00  bitrate
  6.49     14.79     1.19 11119200     0.00     0.00  readframe
  3.76     15.48     0.69 11119200     0.00     0.00  calcframestats
  3.38     16.10     0.62 11119200     0.00     0.00  samplerate
  2.62     16.58     0.48 11119200     0.00     0.00  mpegver
  2.56     17.05     0.47 11119200     0.00     0.00  checkvalidity
  2.51     17.51     0.46 11119200     0.00     0.00  checkconsistency
  2.40     17.95     0.44 11119200     0.00     0.00  framesamples
  1.91     18.30     0.35 11119200     0.00     0.00  init_frame_info
  0.05     18.31     0.01     1800     0.01     0.01  init_file_info
  0.05     18.32     0.01     1800     0.01     0.01  print_file_info
  0.05     18.33     0.01       50     0.20   366.60  parse_args
...
Pagina: 1