確定性重放

THotPDF.DeterministicReplayLog 擷取可能使作業在不同執行間行為不同的外部決策,然後在重放期間取代記錄的結果

擷取的決策

錄製與重放

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;

排序與驗證

每個事件都攜帶單調的序號、事件種類、名稱、兩個帶正負號的 64 位元引數與類型化的結果

重放依序取用事件,並在傳回記錄的結果之前驗證其完整簽章;嚴格模式在耗盡或分歧時提高 EHPDFDeterministicReplayMismatch,而非嚴格模式則保留不符計數與診斷並使用觀察到的結果

CompleteReplay 只有在每個保留的事件都已被取用且沒有不符或丟棄的錄製事件時才成功

界限與效能

EventLimit 預設為 100,000 個事件、DroppedEventCount 回報溢位,而事件儲存以等比方式增長,因此附加成本保持攤銷常數時間

JSON 結構描述是 hotpdf-deterministic-replay-v1;64 位元引數與整數結果編碼為十進位字串,以在跨 JSON 實作之間保留確切的值

相關 API