Le Time Profiler peut mesurer le temps passé sur certaines méthodes. Existe-t-il une méthode similaire qui mesure le nombre de fois qu'une méthode est appelée?Instrument permettant de compter le nombre d'appels de méthode sur l'iPhone
Répondre
DTrace peut le faire, mais seulement dans le simulateur iPhone (il est pris en charge par Snow Leopard, mais pas encore par iOS). J'ai deux writeups sur cette technologie sur MacResearch here et here où je passe en revue quelques études de cas de l'utilisation de DTrace pour rechercher des méthodes spécifiques et quand ils sont appelés.
Par exemple, j'ai créé le script DTrace ci-dessous pour mesurer le nombre de méthodes de fois ont été appelés sur les classes avec le préfixe du CP, ainsi que le total le temps passé dans ces méthodes:
#pragma D option quiet
#pragma D option aggsortrev
dtrace:::BEGIN
{
printf("Sampling Core Plot methods ... Hit Ctrl-C to end.\n");
starttime = timestamp;
}
objc$target:CP*::entry
{
starttimeformethod[probemod,probefunc] = timestamp;
methodhasenteredatleastonce[probemod,probefunc] = 1;
}
objc$target:CP*::return
/methodhasenteredatleastonce[probemod,probefunc] == 1/
{
this->executiontime = (timestamp - starttimeformethod[probemod,probefunc])/1000;
@overallexecutions[probemod,probefunc] = count();
@overallexecutiontime[probemod,probefunc] = sum(this->executiontime);
@averageexecutiontime[probemod,probefunc] = avg(this->executiontime);
}
dtrace:::END
{
milliseconds = (timestamp - starttime)/1000000;
normalize(@overallexecutiontime, 1000);
printf("Ran for %u ms\n", milliseconds);
printf("%30s %30s %20s %20s %20s\n", "Class", "Method", "Total CPU time (ms)", "Executions", "Average CPU time (us)");
printa("%30s %30s %[email protected] %[email protected] %[email protected]\n", @overallexecutiontime, @overallexecutions, @averageexecutiontime);
}
Cela génère la sortie suivante bien formaté:
Class Method Total CPU time (ms) Executions Average CPU time (us)
CPLayer -drawInContext: 6995 352 19874
CPPlot -drawInContext: 5312 88 60374
CPScatterPlot -renderAsVectorInContext: 4332 44 98455
CPXYPlotSpace -viewPointForPlotPoint: 3208 4576 701
CPAxis -layoutSublayers 2050 44 46595
CPXYPlotSpace -viewCoordinateForViewLength:linearPlotRange:plotCoordinateValue: 1870 9152
...
Alors que vous pouvez créer et exécuter des scripts DTrace à partir de la ligne de commande, probablement votre meilleur pari serait de créer un instrument sur mesure dans les instruments et remplir le code approprié D au sein de cet instrument. Vous pouvez ensuite l'exécuter facilement sur votre application dans le simulateur.
Encore une fois, cela ne fonctionnera pas sur l'appareil, mais si vous voulez juste des statistiques sur le nombre de fois quelque chose est appelé, et non la durée, il dure, cela pourrait faire le travail.
Brad Larson - vous dites: « votre meilleur pari serait de créer un instrument sur mesure dans les instruments et remplir le code approprié D au sein de cet instrument » - comment pourrais-je faire cela? Instruments se plaint de erreurs de syntaxe quand je fais ... – shmim
Plus précisément, comment pourrais-je entrer dans votre script ci-dessus, qui ressemble à elle fera exactement ce que je veux :-) – shmim
De plus, les liens vers vos articles sont morts ... – shmim