Deterministyczne powtarzanie

THotPDF.DeterministicReplayLog przechwytuje zewnętrzne decyzje, które mogą sprawić, że operacja zachowa się inaczej między przebiegami, a następnie podstawia zarejestrowane wyniki podczas powtarzania

Przechwycone decyzje

Nagrywaj i powtarzaj

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;

Porządkowanie i walidacja

Każde zdarzenie niesie monotoniczny numer sekwencji, rodzaj zdarzenia, nazwę, dwa argumenty ze znakiem 64-bitowym i typowany wynik

Powtarzanie zużywa zdarzenia w kolejności i sprawdza ich pełną sygnaturę przed zwróceniem zarejestrowanego wyniku; tryb ścisły zgłasza EHPDFDeterministicReplayMismatch przy wyczerpaniu lub rozbieżności, podczas gdy tryb nieścisły zachowuje licznik niezgodności i diagnostykę oraz używa obserwowanego wyniku

CompleteReplay kończy się sukcesem tylko po zużyciu każdego zachowanego zdarzenia bez niezgodności lub porzuconych zdarzeń nagrywania

Granice i wydajność

EventLimit domyślnie wynosi 100 000 zdarzeń, DroppedEventCount raportuje przepełnienie, a magazyn zdarzeń rośnie geometrycznie, więc koszt dołączania pozostaje amorftyzowanym czasem stałym

Schemat JSON to hotpdf-deterministic-replay-v1; argumenty 64-bitowe i wyniki całkowite są kodowane jako łańcuchy dziesiętne, aby zachować dokładne wartości w różnych implementacjach JSON

Powiązane API