Diagnostiche di rendering e telemetria delle operazioni

HotPDF distingue le voci di cache delle pagine renderizzate per ogni stato visibile al chiamante che può cambiare i pixel della pagina ed espone diagnostiche limitate quando il contenuto della pagina non può essere renderizzato completamente

Varianti di cache consapevoli dello stato

THotPDF.RenderLoadedPageToBitmapCached costruisce la chiave delle voci in memoria da pagina, DPI, visibilità effettiva degli optional content, THotPDF.RenderColourIntent e THotPDF.RenderFallbackPolicy

La cache persistente usa lo stesso digest di stato, mentre le modalità fallback che producono diagnostiche restano memory-only così un hit su disco non può perdere i report degli oggetti saltati

Cambiare un gruppo di optional content seleziona un'altra variante invece di cancellare la bitmap precedente, quindi riattivare un layer o un colour intent può riusare il lavoro precedente

Colour intent

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

rciDocument rispetta ogni operatore ri del content stream e resta il default

I quattro valori espliciti sovrascrivono la selezione di intent del content stream e si applicano alle conversioni successive di fill e stroke ICCBased

Politica di fallback

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

THotPDF.GetLastRenderFallbackDiagnostics restituisce l'insieme conservato, mentre THotPDF.ClearLastRenderFallbackDiagnostics lo svuota; le voci di cache in modalità report conservano il loro set di diagnostiche, quindi un hit della cache in memoria restituisce le stesse informazioni di completezza del rendering del render originale

Telemetria unificata delle operazioni

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 restituisce un record THPDFOperationTelemetry contenente wall time, tempo CPU del thread corrente, memoria, allocazione, I/O del processo, decodifica dei filtri, cache, conteggi di oggetti, metriche di successo e cancellazione

Caricamento del documento, rendering di pagina sincrono e in cache, slice di rendering progressivo, ottimizzazione selettiva degli stream e ottimizzazione parallela delle immagini pubblicano la stessa forma di record

PeakMemoryBytes è una stima portabile dell'operazione sul documento e non il working set del processo del sistema operativo, quindi resta stabile tra gli host e include i byte della sorgente caricata, le voci bitmap renderizzate, il peso della cache delle immagini decodificate e l'archiviazione di picco della catena di filtri

PeakProcessMemoryBytes è il più grande working set di processo campionato, mentre AllocationCount è il più grande incremento campionato di blocchi Delphi vivi concorrenti rispetto all'avvio dell'operazione, non un totale di allocazioni sull'intera vita

CPUTimeMicroseconds misura il thread chiamante, mentre ReadIOBytes, WriteIOBytes e OtherIOBytes sono delta di contatori a livello di processo e possono quindi includere lavoro concorrente nello stesso processo

DecodeInputBytes è l'input compresso, DecodeOutputBytes è l'output finale della catena di filtri e DecodedBytes è il lavoro aggregato attraverso ogni stadio di filtro; DecodeExpansionPermille divide l'output finale per l'input, con 1000 che rappresenta 1x

ScheduledMemoryBytes è la stima di ammissione dell'operazione, MemorySchedulerWaitMilliseconds registra il tempo in coda e MemorySchedulerDelayed distingue l'ammissione in coda dal fast path senza allocazioni

I picchi di memoria e allocazione vengono campionati ai confini dell'operazione, al completamento della catena di filtri, alle slice progressive e ai checkpoint di cancellazione, quindi sono segnali operativi a basso overhead e non tracce di profiler a livello di istruzioni

API correlate