Newsgroup: it.comp.lang.c
Titolo: Profiling con gprof

Sto tentando di fare il profiling del mio programma da passare a questo
magnifico programma
http://code.google.com/p/jrfonseca/wiki/Gprof2Dot
che se non conoscete vi consiglio di provarlo.
I bottleneck si vedono a occhio, a seconda del colore del nodo ;)
Comunque ottengo risultati un po' strani, praticamente non mi dà le tempistiche:
--8<---------------cut here---------------start------------->8---
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ms/call  ms/call  name    
  0.0       0.00     0.00 140000000     0.00     0.00  _play [79]
  0.0       0.00     0.00 40000003     0.00     0.00  _loop [80]
  0.0       0.00     0.00 40000000     0.00     0.00  _get_random_card_from_deck [81]
  0.0       0.00     0.00 10000001     0.00     0.00  _make_hand [82]
  0.0       0.00     0.00 10000000     0.00     0.00  _copy_hand [83]
  0.0       0.00     0.00       10     0.00     0.00  _main [84]
  0.0       0.00     0.00       10     0.00     0.00  _output_result [85]
  0.0       0.00     0.00        2     0.00     0.00  __qsort [86]
  0.0       0.00     0.00        1     0.00     0.00  __start [87]
--8<---------------cut here---------------end--------------->8---
Questo qui è lo script bash che uso (liberissimi di usarlo naturalmente):
--8<---------------cut here---------------start------------->8---
#!/bin/bash
# change those variables as you prefer
PROG=$1
PROF="gmon.out"
STATS=$1.stats
TYPE=png
OUT=profiled.$TYPE
OPEN="open"
set -x
./$@
gprof $PROG > $STATS
gprof2dot.py $STATS | dot -T$TYPE -o $OUT
$OPEN $OUT
--8<---------------cut here---------------end--------------->8---
In sostanza succede questo:
--8<---------------cut here---------------start------------->8---
bash-3.2$ c_gprof.sh razz_prof 7 1 A 2 3
+ ./razz_prof 7 1 A 2 3
-1:	284214
5:	714996
6:	1181154
7:	4296540877
8:	4296620522
9:	1430661
10:	4296369488
11:	1012589
12:	766761
13:	4295427610
+ gprof razz_prof
+ gprof2dot.py razz_prof.stats
+ dot -Tpng -o profiled.png
+ open profiled.png
--8<---------------cut here---------------end--------------->8---
I vari flag da passare a gprof mi sembrano solo per disabilitare cose...
Ah dimenticavo l'eseguibile è compilato con 
gcc -Wall -pg -g ...

A quanto pare non va con OSX 10.6, forse il formato è un po' diverso o
gprof vuole qualche flag magico.
Qualcuno lo usa?
Profilando ho visto che questo
--8<---------------cut here---------------start------------->8---
Hand *
copy_hand(Hand *h1/* , Hand *h2 */) {
     int i;
     Hand *new = make_hand();
     for (i = 0; i < RAZZ_CARDS; i++) {
          new->cards[i] = h1->cards[i];
     }
     new->len = h1->len;
     return new;
}
--8<---------------cut here---------------end--------------->8---
Viene eseguito una marea di volte, ho provato a cambiarlo in questo modo
--8<---------------cut here---------------start------------->8---
void
copy_hand(Hand *h1, Hand *h2) {
     int i;
     for (i = 0; i < RAZZ_CARDS; i++) {
          h2->cards[i] = h1->cards[i];
     }
     h2->len = h1->len;
}
--8<---------------cut here---------------end--------------->8---
E mi sembra corretto, quindi alloco un una sola struttura e poi ogni
volta ci ricopio dentro i valori originali.
Ma per qualche motivo non funziona (anche stampando la mano è uguale),
cosa potrebbe esserci di diverso?