@@ -11,52 +11,55 @@ interface
1111, SysUtils
1212, Utilities.Data.Config
1313, Utilities.Data.Entries
14+ , Utilities.Data.Hyperfine
1415;
1516
1617type
1718{ TResults }
1819 TResults = class (TObject)
1920 private
2021 FConfig: TConfig;
22+ FResult: THyperfineResult;
2123
2224 function GenerateProgressBar (APBPosition, APBMax, APBWIdth: Integer): String;
2325 protected
2426 public
2527 constructor Create(AConfigFile: String);
2628 destructor Destroy; override;
2729
28- { $IFDEF UNIX}
29- { $ELSE}
30- { $ENDIF}
30+ procedure Generate ;
3131 published
3232 end ;
3333
3434implementation
3535
3636uses
37- { $IFDEF FPC}
3837 fpjson
3938, jsonparser
40- { $ELSE}
41- { $ENDIF}
4239;
4340
4441const
4542 lineBreak = #13 ;
4643
44+ cTableHeader =
45+ ' | # | Result (m:s.ms): SSD | Compiler | Submitter | Notes | Certificates |' #10 +
46+ ' |--:|---------------------:|:---------|:--------------|:----------|:-------------|' #10 ;
47+
4748{ TResults }
4849
4950constructor TResults.Create(AConfigFile: String);
5051var
5152 configStream: TFileStream;
5253 configJSONData: TJSONData;
5354begin
54- { #todo 99 -ogcarreno : Config file must be used here }
5555 configStream:= TFileStream.Create(AConfigFile, fmOpenRead);
5656 try
5757 configJSONData:= GetJSON(configStream);
58- FConfig:= TConfig.Create(configJSONData);
59- configJSONData.Free;
58+ try
59+ FConfig:= TConfig.Create(configJSONData);
60+ finally
61+ configJSONData.Free;
62+ end ;
6063 finally
6164 configStream.Free;
6265 end ;
@@ -68,6 +71,85 @@ destructor TResults.Destroy;
6871 inherited Destroy;
6972end ;
7073
74+ procedure TResults.Generate ;
75+ type
76+ TResult = record
77+ Result: Double;
78+ Count: Integer;
79+ Compiler: String;
80+ end ;
81+ TResultsArray = array of TResult;
82+
83+ var
84+ index, index1: Integer;
85+ content, hyperfineFile: String;
86+ results: TResultsArray;
87+ hyperfineStream: TFileStream;
88+ hyperfineJSON: TJSONData;
89+ begin
90+ content:= ' ' ;
91+ SetLength(results, FConfig.Entries.Count);
92+
93+ for index:= 0 to Pred(FConfig.Entries.Count) do
94+ begin
95+ Write(GenerateProgressBar(Succ(index), FConfig.Entries.Count, 50 ), lineBreak);
96+ hyperfineFile:= ExpandFileName(
97+ IncludeTrailingPathDelimiter(FConfig.ResultsFolder)+
98+ FConfig.Entries[index].EntryBinary+
99+ ' -1_000_000_000-SSD.json'
100+ );
101+ if not FileExists(hyperfineFile) then continue;
102+ hyperfineStream:= TFileStream.Create(
103+ hyperfineFile,
104+ fmOpenRead
105+ );
106+ try
107+ hyperfineJSON:= GetJSON(hyperfineStream);
108+ try
109+ FResult:= THyperfineResult.Create(
110+ hyperfineJSON.GetPath(cJSONHyperfineResult)
111+ );
112+ try
113+ if FConfig.Entries[index].Compiler = ' fpc' then
114+ begin
115+ results[index].Compiler:= ' lazarus-3.0, fpc-3.2.2' ;
116+ end ;
117+
118+ results[index].Result:= 0.0 ;
119+ results[index].Count:= 0 ;
120+ for index1:= Low(FResult.Times) to High(FResult.Times) do
121+ begin
122+ if (time = FResult.Max) or (time = FResult.Max) then continue;
123+ results[index].Result:= results[index].Result + FResult.Times[index1];
124+ Inc(results[index].Count);
125+ end ;
126+ results[index].Result:= results[index].Result / results[index].Count;
127+ { #todo 99 -ogcarreno : needs to be done after sorting array by time }
128+ content:= content + Format(' | %d | %.2f | %s | %s | %s | |' +LineEnding, [
129+ index,
130+ results[index].Result,
131+ results[index].Compiler,
132+ FConfig.Entries[index].Name ,
133+ FConfig.Entries[index].Notes
134+ ]);
135+ finally
136+ FResult.Free;
137+ end ;
138+ finally
139+ hyperfineJSON.Free;
140+ end ;
141+ finally
142+ hyperfineStream.Free;
143+ end ;
144+ end ;
145+
146+ WriteLn;
147+ WriteLn;
148+ Write(cTableHeader, content);
149+ // The results
150+ WriteLn;
151+ end ;
152+
71153function TResults.GenerateProgressBar (APBPosition, APBMax, APBWIdth: Integer
72154 ): String;
73155var
0 commit comments