Я использую ImageMagick (через расширение PHP imagick) для создания простой анимации GIF, как эта.
И я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?