1 // Bench.h
2
3 #ifndef ZIP7_INC_7ZIP_BENCH_H
4 #define ZIP7_INC_7ZIP_BENCH_H
5
6 #include "../../../Windows/System.h"
7
8 #include "../../Common/CreateCoder.h"
9 #include "../../UI/Common/Property.h"
10
11 UInt64 Benchmark_GetUsage_Percents(UInt64 usage);
12
13 struct CBenchInfo
14 {
15 UInt64 GlobalTime;
16 UInt64 GlobalFreq;
17 UInt64 UserTime;
18 UInt64 UserFreq;
19 UInt64 UnpackSize;
20 UInt64 PackSize;
21 UInt64 NumIterations;
22
23 /*
24 during Code(): we track benchInfo only from one thread (theads with index[0])
25 NumIterations means number of threads
26 UnpackSize and PackSize are total sizes of all iterations of current thread
27 after Code():
28 NumIterations means the number of Iterations
29 UnpackSize and PackSize are total sizes of all threads
30 */
31
CBenchInfoCBenchInfo32 CBenchInfo(): NumIterations(0) {}
33
34 UInt64 GetUsage() const;
35 UInt64 GetRatingPerUsage(UInt64 rating) const;
36 UInt64 GetSpeed(UInt64 numUnits) const;
GetUnpackSizeSpeedCBenchInfo37 UInt64 GetUnpackSizeSpeed() const { return GetSpeed(UnpackSize * NumIterations); }
38
Get_UnpackSize_FullCBenchInfo39 UInt64 Get_UnpackSize_Full() const { return UnpackSize * NumIterations; }
40
41 UInt64 GetRating_LzmaEnc(UInt64 dictSize) const;
42 UInt64 GetRating_LzmaDec() const;
43 };
44
45
46 struct CTotalBenchRes
47 {
48 // UInt64 NumIterations1; // for Usage
49 UInt64 NumIterations2; // for Rating / RPU
50
51 UInt64 Rating;
52 UInt64 Usage;
53 UInt64 RPU;
54 UInt64 Speed;
55
InitCTotalBenchRes56 void Init() { /* NumIterations1 = 0; */ NumIterations2 = 0; Rating = 0; Usage = 0; RPU = 0; Speed = 0; }
57
SetSumCTotalBenchRes58 void SetSum(const CTotalBenchRes &r1, const CTotalBenchRes &r2)
59 {
60 Rating = (r1.Rating + r2.Rating);
61 Usage = (r1.Usage + r2.Usage);
62 RPU = (r1.RPU + r2.RPU);
63 Speed = (r1.Speed + r2.Speed);
64 // NumIterations1 = (r1.NumIterations1 + r2.NumIterations1);
65 NumIterations2 = (r1.NumIterations2 + r2.NumIterations2);
66 }
67
68 void Generate_From_BenchInfo(const CBenchInfo &info);
69 void Mult_For_Weight(unsigned weight);
70 void Update_With_Res(const CTotalBenchRes &r);
71 };
72
73
74 const unsigned kBenchMinDicLogSize = 18;
75
76 UInt64 GetBenchMemoryUsage(UInt32 numThreads, int level, UInt64 dictionary, bool totalBench);
77
78 Z7_PURE_INTERFACES_BEGIN
DECLARE_INTERFACE(IBenchCallback)79 DECLARE_INTERFACE(IBenchCallback)
80 {
81 // virtual HRESULT SetFreq(bool showFreq, UInt64 cpuFreq) = 0;
82 virtual HRESULT SetEncodeResult(const CBenchInfo &info, bool final) = 0;
83 virtual HRESULT SetDecodeResult(const CBenchInfo &info, bool final) = 0;
84 };
85
DECLARE_INTERFACE(IBenchPrintCallback)86 DECLARE_INTERFACE(IBenchPrintCallback)
87 {
88 virtual void Print(const char *s) = 0;
89 virtual void NewLine() = 0;
90 virtual HRESULT CheckBreak() = 0;
91 };
92
DECLARE_INTERFACE(IBenchFreqCallback)93 DECLARE_INTERFACE(IBenchFreqCallback)
94 {
95 virtual HRESULT AddCpuFreq(unsigned numThreads, UInt64 freq, UInt64 usage) = 0;
96 virtual HRESULT FreqsFinished(unsigned numThreads) = 0;
97 };
98 Z7_PURE_INTERFACES_END
99
100 HRESULT Bench(
101 DECL_EXTERNAL_CODECS_LOC_VARS
102 IBenchPrintCallback *printCallback,
103 IBenchCallback *benchCallback,
104 const CObjectVector<CProperty> &props,
105 UInt32 numIterations,
106 bool multiDict,
107 IBenchFreqCallback *freqCallback = NULL);
108
109 AString GetProcessThreadsInfo(const NWindows::NSystem::CProcessAffinity &ti);
110
111 void GetSysInfo(AString &s1, AString &s2);
112 void GetCpuName(AString &s);
113 void AddCpuFeatures(AString &s);
114
115 #ifdef Z7_LARGE_PAGES
116 void Add_LargePages_String(AString &s);
117 #else
118 // #define Add_LargePages_String
119 #endif
120
121 #endif
122