Как я могу использовать Dtrace для расчета времени между произвольными операторами C - PullRequest
0 голосов
/ 25 декабря 2018

Я использую ImageMagick (через расширение PHP imagick) для создания простой анимации GIF, как эта.

enter image description here

И яfound WriteGIFImage() (https://github.com/ImageMagick/ImageMagick/blob/c807b69de68a33b42fc8725486d5ac81688afd16/coders/gif.c#L1506) функция записи данных gif занимает много времени, следуя сценарию D.

pid$target::WriteGIFImage:entry
{
    self->start_WriteGIFImage = timestamp;
    printf("     -> WriteGIFImage\n");
}

pid$target::WriteGIFImage:return
{
    this->delta = (timestamp - self->start_WriteGIFImage) / 1000 / 1000;
    @deltas["WriteGIFImage"] = sum(this->delta);
    printf("     <- WriteGIFImage elapsed %d ms\n", this->delta);
}

// Output
ImagesToBlob
 -> WriteImage
     -> WriteGIFImage
     <- WriteGIFImage elapsed 821 ms
 <- WriteImage elapsed 821 ms
ImagesToBlob elapsed 821 ms

Total (ms):
  RelinquishMagickMemory                                            0
  WriteBlobByte                                                     0
  ImagesToBlob                                                    821
  WriteGIFImage                                                   821
  WriteImage                                                      821

WriteGIFImage() - это большая функция, я хочу знать, сколько времени занимает 2операторы, чтобы найти самый медленный блок кода, например, я подозреваю, что цикл for занимает много времени, поэтому мне нужно, чтобы Dtrace сообщил мне разницу во времени между строками 1673 и 1678. Как я могу использовать сценарий D для его завершения?

1673    for (i=0; i < (ssize_t) image->colors; i++)
1674    {
1675      *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].red));
1676      *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].green));
1677      *q++=ScaleQuantumToChar(ClampToQuantum(image->colormap[i].blue));
1678    }

Кстати, я обнаружил, что ScaleQuantumToChar() и ClampToQuantum() являются встроенными функциями, и зонд pid*::ScaleQuantumToChar:entry/return не может работать. Как отследить встроенные функции с помощью D?

1 Ответ

0 голосов
/ 25 декабря 2018

В дополнение к датчикам entry и return поставщик pid также имеет датчики для каждого смещения команды.Если вы сделаете sudo dtrace -l -n 'pid$target::WriteGIFImage:*' -p <pid>, он перечислит их.Затем вы должны разобрать код, чтобы определить, какое смещение соответствует какой строке кода.И когда программа построена с включенными оптимизациями, эта переписка может быть не чистой.(Инструкции могут быть не в порядке в отношении строк кода.)

Вы также можете определить своих собственных провайдеров статической трассировки (USDT), определяемых пользователем, и дополнить их своим кодом.Справочная страница dtrace объясняет, как.

Все это говорит о том, что DTrace, вероятно, не лучший инструмент для этого.Используйте шаблон инструментов Time Profiler для инструментов, и он сообщит вам, где ваша программа проводит время, вплоть до строки (или даже инструкции).

...