From 59296a7bdcbd148b040daa8532b6444247c2e498 Mon Sep 17 00:00:00 2001 From: Georges Hatem Date: Thu, 9 May 2024 20:27:24 +0300 Subject: [PATCH 1/2] init on the main thread seems faster? --- entries/ghatem-fpc/src/OneBRC-parts.lpr | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/entries/ghatem-fpc/src/OneBRC-parts.lpr b/entries/ghatem-fpc/src/OneBRC-parts.lpr index 8a4bff5..7a07243 100644 --- a/entries/ghatem-fpc/src/OneBRC-parts.lpr +++ b/entries/ghatem-fpc/src/OneBRC-parts.lpr @@ -119,7 +119,7 @@ TOneBRC = class // for a line between idx [aStart; aEnd], returns the station-name length, and the integer-value of temperature procedure ExtractLineData(const aStart: Int64; const aEnd: Int64; out aLength: ShortInt; out aTemp: SmallInt); {$IFNDEF VALGRIND} inline; {$ENDIF} procedure GetNextPart (var aStart, aEnd: Int64); - procedure InitMinMax (const aThreadNb: TThreadCount); + procedure InitMinMax (const aThreadNb: TThreadCount); inline; public constructor Create (const aThreadCount: TThreadCount); @@ -148,20 +148,18 @@ TOneBRC = class TThreadProc = procedure (aThreadNb: TThreadCount; aStartIdx: Int64; aEndIdx: Int64) of object; TGetNextPart = procedure (var aStart, aEnd: Int64) of object; - TInitMinMax = procedure (const aThreadNb: TThreadCount) of object; TBRCThread = class (TThread) private FProc: TThreadProc; FGetNextPart: TGetNextPart; - FInitMinMax: TInitMinMax; FThreadNb: TThreadCount; FStart: Int64; FEnd: Int64; protected procedure Execute; override; public - constructor Create (aProc: TThreadProc; aGetNextPart: TGetNextPart; aInitMinMax: TInitMinMax; + constructor Create (aProc: TThreadProc; aGetNextPart: TGetNextPart; aThreadNb: TThreadCount; aStart: Int64; aEnd: Int64); end; @@ -439,7 +437,8 @@ procedure TOneBRC.DispatchThreads; FDone := cPart * FThreadCount; for I := 0 to FThreadCount - 1 do begin - FThreads[I] := TBRCThread.Create (@ProcessData, @GetNextPart, @InitMinMax, I, I*cPart, (I+1)*cPart); + InitMinMax(I); + FThreads[I] := TBRCThread.Create (@ProcessData, @GetNextPart, I, I*cPart, (I+1)*cPart); end; end; @@ -668,8 +667,6 @@ procedure TOneBRC.GenerateOutput; procedure TBRCThread.Execute; begin - FInitMinMax (FThreadNb); - while true do begin FProc (FThreadNb, FStart, FEnd); FGetNextPart(FStart, FEnd); @@ -677,13 +674,12 @@ procedure TBRCThread.Execute; end; end; -constructor TBRCThread.Create(aProc: TThreadProc; aGetNextPart: TGetNextPart; aInitMinMax: TInitMinMax; +constructor TBRCThread.Create(aProc: TThreadProc; aGetNextPart: TGetNextPart; aThreadNb: TThreadCount; aStart: Int64; aEnd: Int64); begin inherited Create(False); FProc := aProc; FGetNextPart := aGetNextPart; - FInitMinMax := aInitMinMax; FThreadNb := aThreadNb; FStart := aStart; FEnd := aEnd; From 3f57ed74c2fd1e1bf20e6dacc1b59b0f7f92cfda Mon Sep 17 00:00:00 2001 From: Georges Hatem Date: Thu, 9 May 2024 20:29:08 +0300 Subject: [PATCH 2/2] propagate changes to large-rec version --- entries/ghatem-fpc/src/OneBRC-parts-largerec.lpr | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/entries/ghatem-fpc/src/OneBRC-parts-largerec.lpr b/entries/ghatem-fpc/src/OneBRC-parts-largerec.lpr index 72f3d75..40f9f83 100644 --- a/entries/ghatem-fpc/src/OneBRC-parts-largerec.lpr +++ b/entries/ghatem-fpc/src/OneBRC-parts-largerec.lpr @@ -119,7 +119,7 @@ TOneBRC = class // for a line between idx [aStart; aEnd], returns the station-name length, and the integer-value of temperature procedure ExtractLineData(const aStart: Int64; const aEnd: Int64; out aLength: ShortInt; out aTemp: SmallInt); {$IFNDEF VALGRIND} inline; {$ENDIF} procedure GetNextPart (var aStart, aEnd: Int64); - procedure InitMinMax (const aThreadNb: TThreadCount); + procedure InitMinMax (const aThreadNb: TThreadCount); inline; public constructor Create (const aThreadCount: TThreadCount); @@ -148,20 +148,18 @@ TOneBRC = class TThreadProc = procedure (aThreadNb: TThreadCount; aStartIdx: Int64; aEndIdx: Int64) of object; TGetNextPart = procedure (var aStart, aEnd: Int64) of object; - TInitMinMax = procedure (const aThreadNb: TThreadCount) of object; TBRCThread = class (TThread) private FProc: TThreadProc; FGetNextPart: TGetNextPart; - FInitMinMax: TInitMinMax; FThreadNb: TThreadCount; FStart: Int64; FEnd: Int64; protected procedure Execute; override; public - constructor Create (aProc: TThreadProc; aGetNextPart: TGetNextPart; aInitMinMax: TInitMinMax; + constructor Create (aProc: TThreadProc; aGetNextPart: TGetNextPart; aThreadNb: TThreadCount; aStart: Int64; aEnd: Int64); end; @@ -439,7 +437,8 @@ procedure TOneBRC.DispatchThreads; FDone := cPart * FThreadCount; for I := 0 to FThreadCount - 1 do begin - FThreads[I] := TBRCThread.Create (@ProcessData, @GetNextPart, @InitMinMax, I, I*cPart, (I+1)*cPart); + InitMinMax(I); + FThreads[I] := TBRCThread.Create (@ProcessData, @GetNextPart, I, I*cPart, (I+1)*cPart); end; end; @@ -668,8 +667,6 @@ procedure TOneBRC.GenerateOutput; procedure TBRCThread.Execute; begin - FInitMinMax (FThreadNb); - while true do begin FProc (FThreadNb, FStart, FEnd); FGetNextPart(FStart, FEnd); @@ -677,13 +674,12 @@ procedure TBRCThread.Execute; end; end; -constructor TBRCThread.Create(aProc: TThreadProc; aGetNextPart: TGetNextPart; aInitMinMax: TInitMinMax; +constructor TBRCThread.Create(aProc: TThreadProc; aGetNextPart: TGetNextPart; aThreadNb: TThreadCount; aStart: Int64; aEnd: Int64); begin inherited Create(False); FProc := aProc; FGetNextPart := aGetNextPart; - FInitMinMax := aInitMinMax; FThreadNb := aThreadNb; FStart := aStart; FEnd := aEnd;