Reprodução determinística

THotPDF.DeterministicReplayLog captura decisões externas que podem fazer uma operação se comportar de forma diferente entre execuções e, em seguida, substitui os resultados gravados durante a reprodução

Decisões capturadas

Gravar e reproduzir

var
  ReplayJSON: AnsiString;
begin
  PDF.DeterministicReplayLog.BeginRecording;
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  ReplayJSON := PDF.DeterministicReplayLog.ExportJSON;

  PDF.DeterministicReplayLog.ImportJSON(ReplayJSON);
  PDF.ReadProgressiveLinearizedFirstPageSection(Source, Output, Info);
  if not PDF.DeterministicReplayLog.CompleteReplay then
    raise Exception.Create(PDF.DeterministicReplayLog.LastDiagnostic);
end;

Ordenação e validação

Cada evento carrega um número de sequência monotônico, tipo de evento, nome, dois argumentos assinados de 64 bits e um resultado tipado

A reprodução consome eventos em ordem e valida sua assinatura completa antes de retornar o resultado gravado; o modo estrito gera EHPDFDeterministicReplayMismatch em esgotamento ou divergência, enquanto o modo não estrito retém uma contagem de incompatibilidade e diagnóstico e usa o resultado observado

CompleteReplay só tem sucesso depois que cada evento retido foi consumido sem incompatibilidades ou eventos de gravação descartados

Limites e desempenho

EventLimit assume o padrão de 100.000 eventos, DroppedEventCount relata estouro e o armazenamento de eventos cresce geometricamente para que o custo de anexação permaneça em tempo constante amortizado

O esquema JSON é hotpdf-deterministic-replay-v1; argumentos de 64 bits e resultados inteiros são codificados como strings decimais para preservar valores exatos entre implementações JSON

APIs relacionadas