Инструмент для подсчета количества вызовов метода на iPhone - PullRequest
0 голосов
/ 26 ноября 2010

Time Profiler может измерять количество времени, затрачиваемое на определенные методы.Существует ли подобный метод, который измеряет количество раз, которое метод вызывается?

1 Ответ

4 голосов
/ 27 ноября 2010

DTrace может сделать это, но только в симуляторе iPhone (он поддерживается Snow Leopard, но пока не поддерживается iOS).У меня есть две статьи об этой технологии для MacResearch здесь и здесь , где я прохожу некоторые примеры использования DTrace для поиска конкретных методов и при их вызове.

Например, я создал следующий сценарий DTrace, чтобы измерить количество вызовов методов для классов с префиксом CP, а также общее время, затраченное на эти методы:

#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 %20@u %20@u %20@u\n", @overallexecutiontime, @overallexecutions, @averageexecutiontime);
}

.следующий красиво отформатированный вывод:

        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
...

Хотя вы можете создавать и запускать сценарии DTrace из командной строки, вероятно, лучше всего было бы создать собственный инструмент в инструментах и ​​ввести соответствующий код D в этом инструменте.,Затем вы можете легко запустить это для своего приложения в симуляторе.

Опять же, это не будет работать на устройстве, но если вы просто хотите получить статистику о количестве вызовов, а не о продолжительностиработает, это может сделать работу.

...