Rendering Diagnostics and Operation Telemetry

O HotPDF distingue as entradas da cache de páginas renderizadas por todos os estados visíveis ao chamador que possam alterar os píxeis da página e expõe diagnósticos limitados quando o conteúdo da página não pode ser renderizado por completo

State-aware cache variants

THotPDF.RenderLoadedPageToBitmapCached keys memory entries by page, DPI, effective optional-content visibility, THotPDF.RenderColourIntent, and THotPDF.RenderFallbackPolicy

A cache persistente usa o mesmo digest de estado, enquanto os modos de fallback que produzem diagnósticos ficam apenas em memória, para que um acerto em disco não possa perder os relatórios de objetos ignorados

Alterar um grupo de conteúdo opcional seleciona outra variante em vez de eliminar o bitmap anterior, pelo que voltar a alternar uma camada ou um rendering intent permite reutilizar trabalho anterior

Colour intent

PDF.RenderColourIntent := rciRelativeColorimetric;
Bitmap := PDF.RenderLoadedPageToBitmapCached(0, 144);

rciDocument respeita cada operador ri do content stream e continua a ser o valor predefinido

Os quatro valores explícitos sobrepõem-se à seleção de intent do content stream e são aplicados às conversões ICCBased de preenchimento e de traço subsequentes

Fallback policy

PDF.RenderFallbackPolicy := rfpReport;
PDF.RenderFallbackDiagnosticLimit := 256;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
Diagnostics := PDF.GetLastRenderFallbackDiagnostics;

THotPDF.GetLastRenderFallbackDiagnostics devolve o conjunto retido, enquanto THotPDF.ClearLastRenderFallbackDiagnostics o limpa; as entradas da cache em modo relatório mantêm o respetivo conjunto de diagnósticos, pelo que um acerto na cache de memória devolve a mesma informação de completude da renderização que a renderização original

Unified operation telemetry

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 devolve um THPDFOperationTelemetry record containing wall time, current-thread CPU time, memory, allocation, process I/O, filter decode, cache, object-count, success, and cancellation metrics

O carregamento de documentos, a renderização de páginas síncrona e em cache, as fatias de renderização progressiva, a otimização seletiva de streams e a otimização paralela de imagens publicam o mesmo formato de registo

PeakMemoryBytes é uma estimativa portátil por operação sobre o documento, e não o working set do processo no sistema operativo, pelo que se mantém estável entre máquinas e inclui os bytes de origem carregados, as entradas de bitmap renderizadas, o peso da cache de imagens descodificadas e o pico de armazenamento da cadeia de filtros

PeakProcessMemoryBytes é o maior working set do processo amostrado, enquanto AllocationCount é o maior aumento amostrado de blocos ativos em simultâneo no gestor de memória do Delphi, relativamente ao início da operação, e não um total de alocações ao longo da vida

CPUTimeMicroseconds mede a thread chamadora, enquanto ReadIOBytes, WriteIOBytes e OtherIOBytes são deltas de contadores do processo inteiro e podem, por isso, incluir trabalho concorrente no mesmo processo

DecodeInputBytes é a entrada comprimida, DecodeOutputBytes é a saída final da cadeia de filtros e DecodedBytes é o trabalho agregado de todas as etapas de filtro; DecodeExpansionPermille divide a saída final pela entrada, com 1000 a representar 1x

ScheduledMemoryBytes é a estimativa de admissão da operação, MemorySchedulerWaitMilliseconds regista o tempo em fila e MemorySchedulerDelayed distingue a admissão em fila do caminho rápido sem alocações

Os picos de memória e de alocações são amostrados nas fronteiras das operações, na conclusão da cadeia de filtros, nas fatias progressivas e nos pontos de verificação de cancelamento, pelo que são sinais operacionais de baixo custo e não traços de um profiler ao nível da instrução

APIs relacionadas