Диагностика рендеринга и телеметрия операций

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;

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 отличает допуск через очередь от быстрого пути без аллокаций

Пики памяти и аллокаций снимаются на границах операций, завершении цепочки фильтров, прогрессивных срезах и контрольных точках отмены, так что это малозатратные операционные сигналы, а не трассы профилировщика уровня инструкций

Связанные API