Диагностика рендеринга и телеметрия операций
HotPDF различает записи кеша отрисованных страниц по каждому видимому вызывающей стороной состоянию, способному изменить пиксели страницы, и открывает ограниченную диагностику, когда содержимое страницы нельзя отрисовать полностью
Варианты кеша с учётом состояния
THotPDF.RenderLoadedPageToBitmapCached ключует записи в памяти по странице, DPI, эффективной видимости optional content, THotPDF.RenderColourIntent и THotPDF.RenderFallbackPolicy
Постоянный кеш использует тот же state digest, а порождающие диагностику fallback-режимы остаются только в памяти, чтобы попадание на диске не могло потерять отчёты о пропущенных объектах
Изменение группы optional content выбирает другой вариант вместо удаления прежнего bitmap, поэтому переключение слоя или цветового intent обратно может переиспользовать прежнюю работу
Цветовой intent
PDF.RenderColourIntent := rciRelativeColorimetric;
Bitmap := PDF.RenderLoadedPageToBitmapCached(0, 144);
rciDocument учитывает каждый оператор ri в content stream и остаётся значением по умолчанию
Четыре явных значения переопределяют выбор intent в content stream и применяются к последующим конверсиям заливки и обводки ICCBased
Политика fallback
PDF.RenderFallbackPolicy := rfpReport;
PDF.RenderFallbackDiagnosticLimit := 256;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
Diagnostics := PDF.GetLastRenderFallbackDiagnostics;
rfpIgnoreсохраняет прежнее разрешающее поведениеrfpReportзаписывает неподдерживаемые операторы, отсутствующие ресурсы, неверные объекты, сбои декодирования, лимиты рекурсии и неподдерживаемые типы объектовrfpStrictвозбуждает исключение при первом fallback вне compatibility-секции изBXиEXTHotPDF.RenderFallbackDiagnosticLimitограничивает удерживаемую диагностикуTHotPDF.LastRenderFallbackDroppedCountсообщает диагностику, отброшенную после достижения настроенного лимита
THotPDF.GetLastRenderFallbackDiagnostics возвращает удерживаемый набор, а THotPDF.ClearLastRenderFallbackDiagnostics его очищает; кешированные записи report-режима сохраняют свой диагностический набор, поэтому попадание в кеш памяти возвращает ту же информацию о полноте рендеринга, что и исходная отрисовка
Единая телеметрия операций
if PDF.GetLastOperationTelemetry(Info) then
begin
WriteLn(Info.OperationName);
WriteLn(Info.ElapsedMilliseconds);
WriteLn(Info.CPUTimeMicroseconds);
WriteLn(Info.PeakProcessMemoryBytes);
WriteLn(Info.MemorySchedulerWaitMilliseconds);
WriteLn(Info.DecodeExpansionPermille);
end;
THotPDF.GetLastOperationTelemetry возвращает запись THPDFOperationTelemetry с метриками настенного времени, CPU текущего потока, памяти, аллокаций, process I/O, декодирования фильтров, кеша, числа объектов, успеха и отмены
Загрузка документа, синхронный и кешированный рендеринг страниц, срезы прогрессивного рендеринга, выборочная оптимизация stream'ов и параллельная оптимизация изображений публикуют одну и ту же форму записи
PeakMemoryBytes — переносимая оценка операции над документом, а не working set процесса ОС, поэтому она стабильна между хостами и включает загруженные байты источника, записи отрисованных bitmap, вес кеша декодированных изображений и пиковое хранилище цепочки фильтров
PeakProcessMemoryBytes — наибольший замеренный working set процесса, а AllocationCount — наибольший замеренный прирост одновременно живущих блоков Delphi memory manager относительно старта операции, а не суммарное число аллокаций за жизнь
CPUTimeMicroseconds измеряет вызывающий поток, а ReadIOBytes, WriteIOBytes и OtherIOBytes — дельты счётчиков на весь процесс, поэтому могут включать конкурентную работу в том же процессе
DecodeInputBytes — сжатый вход, DecodeOutputBytes — финальный выход цепочки фильтров, а DecodedBytes — суммарная работа по всем стадиям фильтров; DecodeExpansionPermille делит финальный выход на вход, где 1000 означает 1x
ScheduledMemoryBytes — оценка допуска операции, MemorySchedulerWaitMilliseconds фиксирует время в очереди, а MemorySchedulerDelayed отличает допуск через очередь от быстрого пути без аллокаций
Пики памяти и аллокаций снимаются на границах операций, завершении цепочки фильтров, прогрессивных срезах и контрольных точках отмены, так что это малозатратные операционные сигналы, а не трассы профилировщика уровня инструкций