1*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Defs.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyException.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Synchronization.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/System.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/SystemInfo.h"
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/ComboBox.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Control/Edit.h"
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodProps.h"
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/DialogSize.h"
24*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/HelpUtils.h"
25*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
26*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/resourceGui.h"
27*f6dc9357SAndroid Build Coastguard Worker
28*f6dc9357SAndroid Build Coastguard Worker #include "../../MyVersion.h"
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker #include "../Common/Bench.h"
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker #include "BenchmarkDialogRes.h"
33*f6dc9357SAndroid Build Coastguard Worker #include "BenchmarkDialog.h"
34*f6dc9357SAndroid Build Coastguard Worker
35*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker #define kHelpTopic "fm/benchmark.htm"
38*f6dc9357SAndroid Build Coastguard Worker
39*f6dc9357SAndroid Build Coastguard Worker static const UINT_PTR kTimerID = 4;
40*f6dc9357SAndroid Build Coastguard Worker static const UINT kTimerElapse = 1000; // 1000
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker // use PRINT_ITER_TIME to show time of each iteration in log box
43*f6dc9357SAndroid Build Coastguard Worker // #define PRINT_ITER_TIME
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker static const unsigned kRatingVector_NumBundlesMax = 20;
46*f6dc9357SAndroid Build Coastguard Worker
47*f6dc9357SAndroid Build Coastguard Worker enum MyBenchMessages
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker k_Message_Finished = WM_APP + 1
50*f6dc9357SAndroid Build Coastguard Worker };
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker enum My_Message_WPARAM
53*f6dc9357SAndroid Build Coastguard Worker {
54*f6dc9357SAndroid Build Coastguard Worker k_Msg_WPARM_Thread_Finished = 0,
55*f6dc9357SAndroid Build Coastguard Worker k_Msg_WPARM_Iter_Finished,
56*f6dc9357SAndroid Build Coastguard Worker k_Msg_WPARM_Enc1_Finished
57*f6dc9357SAndroid Build Coastguard Worker };
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker struct CBenchPassResult
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes Enc;
63*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes Dec;
64*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
65*f6dc9357SAndroid Build Coastguard Worker DWORD Ticks;
66*f6dc9357SAndroid Build Coastguard Worker #endif
67*f6dc9357SAndroid Build Coastguard Worker // CBenchInfo EncInfo; // for debug
68*f6dc9357SAndroid Build Coastguard Worker // CBenchPassResult() {};
69*f6dc9357SAndroid Build Coastguard Worker };
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker struct CTotalBenchRes2: public CTotalBenchRes
73*f6dc9357SAndroid Build Coastguard Worker {
74*f6dc9357SAndroid Build Coastguard Worker UInt64 UnpackSize;
75*f6dc9357SAndroid Build Coastguard Worker
InitCTotalBenchRes276*f6dc9357SAndroid Build Coastguard Worker void Init()
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes::Init();
79*f6dc9357SAndroid Build Coastguard Worker UnpackSize = 0;
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker
SetFrom_BenchInfoCTotalBenchRes282*f6dc9357SAndroid Build Coastguard Worker void SetFrom_BenchInfo(const CBenchInfo &info)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker NumIterations2 = 1;
85*f6dc9357SAndroid Build Coastguard Worker Generate_From_BenchInfo(info);
86*f6dc9357SAndroid Build Coastguard Worker UnpackSize = info.Get_UnpackSize_Full();
87*f6dc9357SAndroid Build Coastguard Worker }
88*f6dc9357SAndroid Build Coastguard Worker
Update_With_Res2CTotalBenchRes289*f6dc9357SAndroid Build Coastguard Worker void Update_With_Res2(const CTotalBenchRes2 &r)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker Update_With_Res(r);
92*f6dc9357SAndroid Build Coastguard Worker UnpackSize += r.UnpackSize;
93*f6dc9357SAndroid Build Coastguard Worker }
94*f6dc9357SAndroid Build Coastguard Worker };
95*f6dc9357SAndroid Build Coastguard Worker
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker struct CSyncData
98*f6dc9357SAndroid Build Coastguard Worker {
99*f6dc9357SAndroid Build Coastguard Worker UInt32 NumPasses_Finished;
100*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
101*f6dc9357SAndroid Build Coastguard Worker DWORD TotalTicks;
102*f6dc9357SAndroid Build Coastguard Worker #endif
103*f6dc9357SAndroid Build Coastguard Worker int RatingVector_DeletedIndex;
104*f6dc9357SAndroid Build Coastguard Worker // UInt64 RatingVector_NumDeleted;
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker bool BenchWasFinished; // all passes were finished
107*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Freq;
108*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_RatingVector;
109*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Enc_1;
110*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Enc;
111*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Dec_1;
112*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Dec;
113*f6dc9357SAndroid Build Coastguard Worker bool NeedPrint_Tot; // intermediate Total was updated after current pass
114*f6dc9357SAndroid Build Coastguard Worker
115*f6dc9357SAndroid Build Coastguard Worker // UInt64 NumEncProgress; // for debug
116*f6dc9357SAndroid Build Coastguard Worker // UInt64 NumDecProgress; // for debug
117*f6dc9357SAndroid Build Coastguard Worker // CBenchInfo EncInfo; // for debug
118*f6dc9357SAndroid Build Coastguard Worker
119*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 Enc_BenchRes_1;
120*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 Enc_BenchRes;
121*f6dc9357SAndroid Build Coastguard Worker
122*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 Dec_BenchRes_1;
123*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 Dec_BenchRes;
124*f6dc9357SAndroid Build Coastguard Worker
125*f6dc9357SAndroid Build Coastguard Worker void Init();
126*f6dc9357SAndroid Build Coastguard Worker };
127*f6dc9357SAndroid Build Coastguard Worker
128*f6dc9357SAndroid Build Coastguard Worker
Init()129*f6dc9357SAndroid Build Coastguard Worker void CSyncData::Init()
130*f6dc9357SAndroid Build Coastguard Worker {
131*f6dc9357SAndroid Build Coastguard Worker NumPasses_Finished = 0;
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker // NumEncProgress = 0;
134*f6dc9357SAndroid Build Coastguard Worker // NumDecProgress = 0;
135*f6dc9357SAndroid Build Coastguard Worker
136*f6dc9357SAndroid Build Coastguard Worker Enc_BenchRes.Init();
137*f6dc9357SAndroid Build Coastguard Worker Enc_BenchRes_1.Init();
138*f6dc9357SAndroid Build Coastguard Worker Dec_BenchRes.Init();
139*f6dc9357SAndroid Build Coastguard Worker Dec_BenchRes_1.Init();
140*f6dc9357SAndroid Build Coastguard Worker
141*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
142*f6dc9357SAndroid Build Coastguard Worker TotalTicks = 0;
143*f6dc9357SAndroid Build Coastguard Worker #endif
144*f6dc9357SAndroid Build Coastguard Worker
145*f6dc9357SAndroid Build Coastguard Worker RatingVector_DeletedIndex = -1;
146*f6dc9357SAndroid Build Coastguard Worker // RatingVector_NumDeleted = 0;
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker BenchWasFinished =
149*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Freq =
150*f6dc9357SAndroid Build Coastguard Worker NeedPrint_RatingVector =
151*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Enc_1 =
152*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Enc =
153*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Dec_1 =
154*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Dec =
155*f6dc9357SAndroid Build Coastguard Worker NeedPrint_Tot = false;
156*f6dc9357SAndroid Build Coastguard Worker }
157*f6dc9357SAndroid Build Coastguard Worker
158*f6dc9357SAndroid Build Coastguard Worker
159*f6dc9357SAndroid Build Coastguard Worker struct CBenchProgressSync
160*f6dc9357SAndroid Build Coastguard Worker {
161*f6dc9357SAndroid Build Coastguard Worker bool Exit; // GUI asks BenchThread to Exit, and BenchThread reads that variable
162*f6dc9357SAndroid Build Coastguard Worker bool TextWasChanged;
163*f6dc9357SAndroid Build Coastguard Worker
164*f6dc9357SAndroid Build Coastguard Worker UInt32 NumThreads;
165*f6dc9357SAndroid Build Coastguard Worker UInt64 DictSize;
166*f6dc9357SAndroid Build Coastguard Worker UInt32 NumPasses_Limit;
167*f6dc9357SAndroid Build Coastguard Worker int Level;
168*f6dc9357SAndroid Build Coastguard Worker
169*f6dc9357SAndroid Build Coastguard Worker AString Text;
170*f6dc9357SAndroid Build Coastguard Worker
171*f6dc9357SAndroid Build Coastguard Worker /* BenchFinish_Task_HRESULT - for result from benchmark code
172*f6dc9357SAndroid Build Coastguard Worker BenchFinish_Thread_HRESULT - for Exceptions and service errors
173*f6dc9357SAndroid Build Coastguard Worker these arreos must be shown even if user escapes benchmark */
174*f6dc9357SAndroid Build Coastguard Worker HRESULT BenchFinish_Task_HRESULT;
175*f6dc9357SAndroid Build Coastguard Worker HRESULT BenchFinish_Thread_HRESULT;
176*f6dc9357SAndroid Build Coastguard Worker
177*f6dc9357SAndroid Build Coastguard Worker UInt32 NumFreqThreadsPrev;
178*f6dc9357SAndroid Build Coastguard Worker UString FreqString_Sync;
179*f6dc9357SAndroid Build Coastguard Worker UString FreqString_GUI;
180*f6dc9357SAndroid Build Coastguard Worker
181*f6dc9357SAndroid Build Coastguard Worker // must be written by benchmark thread, read by GUI thread */
182*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CBenchPassResult> RatingVector;
183*f6dc9357SAndroid Build Coastguard Worker CSyncData sd;
184*f6dc9357SAndroid Build Coastguard Worker
185*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSection CS;
186*f6dc9357SAndroid Build Coastguard Worker
CBenchProgressSyncCBenchProgressSync187*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync()
188*f6dc9357SAndroid Build Coastguard Worker {
189*f6dc9357SAndroid Build Coastguard Worker NumPasses_Limit = 1;
190*f6dc9357SAndroid Build Coastguard Worker }
191*f6dc9357SAndroid Build Coastguard Worker
192*f6dc9357SAndroid Build Coastguard Worker void Init();
193*f6dc9357SAndroid Build Coastguard Worker
SendExitCBenchProgressSync194*f6dc9357SAndroid Build Coastguard Worker void SendExit()
195*f6dc9357SAndroid Build Coastguard Worker {
196*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(CS);
197*f6dc9357SAndroid Build Coastguard Worker Exit = true;
198*f6dc9357SAndroid Build Coastguard Worker }
199*f6dc9357SAndroid Build Coastguard Worker };
200*f6dc9357SAndroid Build Coastguard Worker
201*f6dc9357SAndroid Build Coastguard Worker
Init()202*f6dc9357SAndroid Build Coastguard Worker void CBenchProgressSync::Init()
203*f6dc9357SAndroid Build Coastguard Worker {
204*f6dc9357SAndroid Build Coastguard Worker Exit = false;
205*f6dc9357SAndroid Build Coastguard Worker
206*f6dc9357SAndroid Build Coastguard Worker BenchFinish_Task_HRESULT = S_OK;
207*f6dc9357SAndroid Build Coastguard Worker BenchFinish_Thread_HRESULT = S_OK;
208*f6dc9357SAndroid Build Coastguard Worker
209*f6dc9357SAndroid Build Coastguard Worker sd.Init();
210*f6dc9357SAndroid Build Coastguard Worker RatingVector.Clear();
211*f6dc9357SAndroid Build Coastguard Worker
212*f6dc9357SAndroid Build Coastguard Worker NumFreqThreadsPrev = 0;
213*f6dc9357SAndroid Build Coastguard Worker FreqString_Sync.Empty();
214*f6dc9357SAndroid Build Coastguard Worker FreqString_GUI.Empty();
215*f6dc9357SAndroid Build Coastguard Worker
216*f6dc9357SAndroid Build Coastguard Worker Text.Empty();
217*f6dc9357SAndroid Build Coastguard Worker TextWasChanged = true;
218*f6dc9357SAndroid Build Coastguard Worker }
219*f6dc9357SAndroid Build Coastguard Worker
220*f6dc9357SAndroid Build Coastguard Worker
221*f6dc9357SAndroid Build Coastguard Worker
222*f6dc9357SAndroid Build Coastguard Worker struct CMyFont
223*f6dc9357SAndroid Build Coastguard Worker {
224*f6dc9357SAndroid Build Coastguard Worker HFONT _font;
CMyFontCMyFont225*f6dc9357SAndroid Build Coastguard Worker CMyFont(): _font(NULL) {}
~CMyFontCMyFont226*f6dc9357SAndroid Build Coastguard Worker ~CMyFont()
227*f6dc9357SAndroid Build Coastguard Worker {
228*f6dc9357SAndroid Build Coastguard Worker if (_font)
229*f6dc9357SAndroid Build Coastguard Worker DeleteObject(_font);
230*f6dc9357SAndroid Build Coastguard Worker }
CreateCMyFont231*f6dc9357SAndroid Build Coastguard Worker void Create(const LOGFONT *lplf)
232*f6dc9357SAndroid Build Coastguard Worker {
233*f6dc9357SAndroid Build Coastguard Worker _font = CreateFontIndirect(lplf);
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker };
236*f6dc9357SAndroid Build Coastguard Worker
237*f6dc9357SAndroid Build Coastguard Worker
238*f6dc9357SAndroid Build Coastguard Worker class CBenchmarkDialog;
239*f6dc9357SAndroid Build Coastguard Worker
240*f6dc9357SAndroid Build Coastguard Worker struct CThreadBenchmark
241*f6dc9357SAndroid Build Coastguard Worker {
242*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog *BenchmarkDialog;
243*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS_DECL
244*f6dc9357SAndroid Build Coastguard Worker // HRESULT Result;
245*f6dc9357SAndroid Build Coastguard Worker
246*f6dc9357SAndroid Build Coastguard Worker HRESULT Process();
MyThreadFunctionCThreadBenchmark247*f6dc9357SAndroid Build Coastguard Worker static THREAD_FUNC_DECL MyThreadFunction(void *param)
248*f6dc9357SAndroid Build Coastguard Worker {
249*f6dc9357SAndroid Build Coastguard Worker /* ((CThreadBenchmark *)param)->Result = */
250*f6dc9357SAndroid Build Coastguard Worker ((CThreadBenchmark *)param)->Process();
251*f6dc9357SAndroid Build Coastguard Worker return 0;
252*f6dc9357SAndroid Build Coastguard Worker }
253*f6dc9357SAndroid Build Coastguard Worker };
254*f6dc9357SAndroid Build Coastguard Worker
255*f6dc9357SAndroid Build Coastguard Worker
256*f6dc9357SAndroid Build Coastguard Worker class CBenchmarkDialog:
257*f6dc9357SAndroid Build Coastguard Worker public NWindows::NControl::CModalDialog
258*f6dc9357SAndroid Build Coastguard Worker {
259*f6dc9357SAndroid Build Coastguard Worker bool _finishTime_WasSet;
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker bool WasStopped_in_GUI;
262*f6dc9357SAndroid Build Coastguard Worker bool ExitWasAsked_in_GUI;
263*f6dc9357SAndroid Build Coastguard Worker bool NeedRestart;
264*f6dc9357SAndroid Build Coastguard Worker
265*f6dc9357SAndroid Build Coastguard Worker bool RamSize_Defined;
266*f6dc9357SAndroid Build Coastguard Worker
267*f6dc9357SAndroid Build Coastguard Worker public:
268*f6dc9357SAndroid Build Coastguard Worker bool TotalMode;
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker private:
271*f6dc9357SAndroid Build Coastguard Worker
272*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CComboBox m_Dictionary;
273*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CComboBox m_NumThreads;
274*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CComboBox m_NumPasses;
275*f6dc9357SAndroid Build Coastguard Worker NWindows::NControl::CEdit _consoleEdit;
276*f6dc9357SAndroid Build Coastguard Worker UINT_PTR _timer;
277*f6dc9357SAndroid Build Coastguard Worker
278*f6dc9357SAndroid Build Coastguard Worker UInt32 _startTime;
279*f6dc9357SAndroid Build Coastguard Worker UInt32 _finishTime;
280*f6dc9357SAndroid Build Coastguard Worker
281*f6dc9357SAndroid Build Coastguard Worker CMyFont _font;
282*f6dc9357SAndroid Build Coastguard Worker
283*f6dc9357SAndroid Build Coastguard Worker size_t RamSize;
284*f6dc9357SAndroid Build Coastguard Worker size_t RamSize_Limit;
285*f6dc9357SAndroid Build Coastguard Worker
286*f6dc9357SAndroid Build Coastguard Worker UInt32 NumPasses_Finished_Prev;
287*f6dc9357SAndroid Build Coastguard Worker
288*f6dc9357SAndroid Build Coastguard Worker UString ElapsedSec_Prev;
289*f6dc9357SAndroid Build Coastguard Worker
InitSyncNew()290*f6dc9357SAndroid Build Coastguard Worker void InitSyncNew()
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker NumPasses_Finished_Prev = (UInt32)(Int32)-1;
293*f6dc9357SAndroid Build Coastguard Worker ElapsedSec_Prev.Empty();
294*f6dc9357SAndroid Build Coastguard Worker Sync.Init();
295*f6dc9357SAndroid Build Coastguard Worker }
296*f6dc9357SAndroid Build Coastguard Worker
297*f6dc9357SAndroid Build Coastguard Worker virtual bool OnInit() Z7_override;
298*f6dc9357SAndroid Build Coastguard Worker virtual bool OnDestroy() Z7_override;
299*f6dc9357SAndroid Build Coastguard Worker virtual bool OnSize(WPARAM /* wParam */, int xSize, int ySize) Z7_override;
300*f6dc9357SAndroid Build Coastguard Worker virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam) Z7_override;
301*f6dc9357SAndroid Build Coastguard Worker virtual bool OnCommand(unsigned code, unsigned itemID, LPARAM lParam) Z7_override;
302*f6dc9357SAndroid Build Coastguard Worker virtual void OnHelp() Z7_override;
303*f6dc9357SAndroid Build Coastguard Worker virtual void OnCancel() Z7_override;
304*f6dc9357SAndroid Build Coastguard Worker virtual bool OnTimer(WPARAM timerID, LPARAM callback) Z7_override;
305*f6dc9357SAndroid Build Coastguard Worker virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND) Z7_override;
306*f6dc9357SAndroid Build Coastguard Worker
307*f6dc9357SAndroid Build Coastguard Worker void Disable_Stop_Button();
308*f6dc9357SAndroid Build Coastguard Worker void OnStopButton();
309*f6dc9357SAndroid Build Coastguard Worker void RestartBenchmark();
310*f6dc9357SAndroid Build Coastguard Worker void StartBenchmark();
311*f6dc9357SAndroid Build Coastguard Worker
312*f6dc9357SAndroid Build Coastguard Worker void UpdateGui();
313*f6dc9357SAndroid Build Coastguard Worker
314*f6dc9357SAndroid Build Coastguard Worker void PrintTime();
315*f6dc9357SAndroid Build Coastguard Worker void PrintRating(UInt64 rating, UINT controlID);
316*f6dc9357SAndroid Build Coastguard Worker void PrintUsage(UInt64 usage, UINT controlID);
317*f6dc9357SAndroid Build Coastguard Worker void PrintBenchRes(const CTotalBenchRes2 &info, const UINT ids[]);
318*f6dc9357SAndroid Build Coastguard Worker
319*f6dc9357SAndroid Build Coastguard Worker UInt32 GetNumberOfThreads();
320*f6dc9357SAndroid Build Coastguard Worker size_t OnChangeDictionary();
321*f6dc9357SAndroid Build Coastguard Worker
322*f6dc9357SAndroid Build Coastguard Worker void SetItemText_Number(unsigned itemID, UInt64 val, LPCTSTR post = NULL);
323*f6dc9357SAndroid Build Coastguard Worker void Print_MemUsage(UString &s, UInt64 memUsage) const;
IsMemoryUsageOK(UInt64 memUsage) const324*f6dc9357SAndroid Build Coastguard Worker bool IsMemoryUsageOK(UInt64 memUsage) const
325*f6dc9357SAndroid Build Coastguard Worker { return memUsage + (1 << 20) <= RamSize_Limit; }
326*f6dc9357SAndroid Build Coastguard Worker
327*f6dc9357SAndroid Build Coastguard Worker void MyKillTimer();
328*f6dc9357SAndroid Build Coastguard Worker
SendExit_Status(const wchar_t * message)329*f6dc9357SAndroid Build Coastguard Worker void SendExit_Status(const wchar_t *message)
330*f6dc9357SAndroid Build Coastguard Worker {
331*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_BENCH_ERROR_MESSAGE, message);
332*f6dc9357SAndroid Build Coastguard Worker Sync.SendExit();
333*f6dc9357SAndroid Build Coastguard Worker }
334*f6dc9357SAndroid Build Coastguard Worker
335*f6dc9357SAndroid Build Coastguard Worker public:
336*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync Sync;
337*f6dc9357SAndroid Build Coastguard Worker
338*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CProperty> Props;
339*f6dc9357SAndroid Build Coastguard Worker
340*f6dc9357SAndroid Build Coastguard Worker CSysString Bench2Text;
341*f6dc9357SAndroid Build Coastguard Worker
342*f6dc9357SAndroid Build Coastguard Worker NWindows::CThread _thread;
343*f6dc9357SAndroid Build Coastguard Worker CThreadBenchmark _threadBenchmark;
344*f6dc9357SAndroid Build Coastguard Worker
CBenchmarkDialog()345*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog():
346*f6dc9357SAndroid Build Coastguard Worker WasStopped_in_GUI(false),
347*f6dc9357SAndroid Build Coastguard Worker ExitWasAsked_in_GUI(false),
348*f6dc9357SAndroid Build Coastguard Worker NeedRestart(false),
349*f6dc9357SAndroid Build Coastguard Worker TotalMode(false),
350*f6dc9357SAndroid Build Coastguard Worker _timer(0)
351*f6dc9357SAndroid Build Coastguard Worker {}
352*f6dc9357SAndroid Build Coastguard Worker
353*f6dc9357SAndroid Build Coastguard Worker ~CBenchmarkDialog() Z7_DESTRUCTOR_override;
354*f6dc9357SAndroid Build Coastguard Worker
PostMsg_Finish(WPARAM wparam)355*f6dc9357SAndroid Build Coastguard Worker bool PostMsg_Finish(WPARAM wparam)
356*f6dc9357SAndroid Build Coastguard Worker {
357*f6dc9357SAndroid Build Coastguard Worker if ((HWND)*this)
358*f6dc9357SAndroid Build Coastguard Worker return PostMsg(k_Message_Finished, wparam);
359*f6dc9357SAndroid Build Coastguard Worker // the (HWND)*this is NULL only for some internal code failure
360*f6dc9357SAndroid Build Coastguard Worker return true;
361*f6dc9357SAndroid Build Coastguard Worker }
362*f6dc9357SAndroid Build Coastguard Worker
Create(HWND wndParent=NULL)363*f6dc9357SAndroid Build Coastguard Worker INT_PTR Create(HWND wndParent = NULL)
364*f6dc9357SAndroid Build Coastguard Worker {
365*f6dc9357SAndroid Build Coastguard Worker BIG_DIALOG_SIZE(332, 228);
366*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::Create(TotalMode ? IDD_BENCH_TOTAL : SIZED_DIALOG(IDD_BENCH), wndParent);
367*f6dc9357SAndroid Build Coastguard Worker }
MessageBoxError(LPCWSTR message)368*f6dc9357SAndroid Build Coastguard Worker void MessageBoxError(LPCWSTR message)
369*f6dc9357SAndroid Build Coastguard Worker {
370*f6dc9357SAndroid Build Coastguard Worker MessageBoxW(*this, message, L"7-Zip", MB_ICONERROR);
371*f6dc9357SAndroid Build Coastguard Worker }
MessageBoxError_Status(LPCWSTR message)372*f6dc9357SAndroid Build Coastguard Worker void MessageBoxError_Status(LPCWSTR message)
373*f6dc9357SAndroid Build Coastguard Worker {
374*f6dc9357SAndroid Build Coastguard Worker UString s ("ERROR: ");
375*f6dc9357SAndroid Build Coastguard Worker s += message;
376*f6dc9357SAndroid Build Coastguard Worker MessageBoxError(s);
377*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_BENCH_ERROR_MESSAGE, s);
378*f6dc9357SAndroid Build Coastguard Worker }
379*f6dc9357SAndroid Build Coastguard Worker };
380*f6dc9357SAndroid Build Coastguard Worker
381*f6dc9357SAndroid Build Coastguard Worker
382*f6dc9357SAndroid Build Coastguard Worker
383*f6dc9357SAndroid Build Coastguard Worker
384*f6dc9357SAndroid Build Coastguard Worker
385*f6dc9357SAndroid Build Coastguard Worker
386*f6dc9357SAndroid Build Coastguard Worker
387*f6dc9357SAndroid Build Coastguard Worker
388*f6dc9357SAndroid Build Coastguard Worker
389*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode);
390*f6dc9357SAndroid Build Coastguard Worker
391*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
392*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs[] =
393*f6dc9357SAndroid Build Coastguard Worker {
394*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DICTIONARY,
395*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_MEMORY,
396*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_NUM_THREADS,
397*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_SIZE,
398*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_RATING_LABEL,
399*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_USAGE_LABEL,
400*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_RPU_LABEL,
401*f6dc9357SAndroid Build Coastguard Worker IDG_BENCH_COMPRESSING,
402*f6dc9357SAndroid Build Coastguard Worker IDG_BENCH_DECOMPRESSING,
403*f6dc9357SAndroid Build Coastguard Worker IDG_BENCH_TOTAL_RATING,
404*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_CURRENT,
405*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_RESULTING,
406*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_ELAPSED,
407*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_PASSES,
408*f6dc9357SAndroid Build Coastguard Worker IDB_STOP,
409*f6dc9357SAndroid Build Coastguard Worker IDB_RESTART
410*f6dc9357SAndroid Build Coastguard Worker };
411*f6dc9357SAndroid Build Coastguard Worker
412*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kLangIDs_RemoveColon[] =
413*f6dc9357SAndroid Build Coastguard Worker {
414*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_SPEED
415*f6dc9357SAndroid Build Coastguard Worker };
416*f6dc9357SAndroid Build Coastguard Worker
417*f6dc9357SAndroid Build Coastguard Worker #endif
418*f6dc9357SAndroid Build Coastguard Worker
419*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kProcessingString = TEXT("...");
420*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kGB = TEXT(" GB");
421*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kMB = TEXT(" MB");
422*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKB = TEXT(" KB");
423*f6dc9357SAndroid Build Coastguard Worker // static LPCTSTR const kMIPS = TEXT(" MIPS");
424*f6dc9357SAndroid Build Coastguard Worker static LPCTSTR const kKBs = TEXT(" KB/s");
425*f6dc9357SAndroid Build Coastguard Worker
426*f6dc9357SAndroid Build Coastguard Worker static const unsigned kMinDicLogSize = 18;
427*f6dc9357SAndroid Build Coastguard Worker
428*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kMinDicSize = (UInt32)1 << kMinDicLogSize;
429*f6dc9357SAndroid Build Coastguard Worker static const size_t kMaxDicSize = (size_t)1 << (22 + sizeof(size_t) / 4 * 5);
430*f6dc9357SAndroid Build Coastguard Worker // static const size_t kMaxDicSize = (size_t)1 << 16;
431*f6dc9357SAndroid Build Coastguard Worker /*
432*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_64BIT
433*f6dc9357SAndroid Build Coastguard Worker (UInt32)(Int32)-1; // we can use it, if we want 4 GB buffer
434*f6dc9357SAndroid Build Coastguard Worker // (UInt32)15 << 28;
435*f6dc9357SAndroid Build Coastguard Worker #else
436*f6dc9357SAndroid Build Coastguard Worker (UInt32)1 << 27;
437*f6dc9357SAndroid Build Coastguard Worker #endif
438*f6dc9357SAndroid Build Coastguard Worker */
439*f6dc9357SAndroid Build Coastguard Worker
440*f6dc9357SAndroid Build Coastguard Worker
ComboBox_Add_UInt32(NWindows::NControl::CComboBox & cb,UInt32 v)441*f6dc9357SAndroid Build Coastguard Worker static int ComboBox_Add_UInt32(NWindows::NControl::CComboBox &cb, UInt32 v)
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker TCHAR s[16];
444*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(v, s);
445*f6dc9357SAndroid Build Coastguard Worker const int index = (int)cb.AddString(s);
446*f6dc9357SAndroid Build Coastguard Worker cb.SetItemData(index, (LPARAM)v);
447*f6dc9357SAndroid Build Coastguard Worker return index;
448*f6dc9357SAndroid Build Coastguard Worker }
449*f6dc9357SAndroid Build Coastguard Worker
450*f6dc9357SAndroid Build Coastguard Worker
OnInit()451*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnInit()
452*f6dc9357SAndroid Build Coastguard Worker {
453*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LANG
454*f6dc9357SAndroid Build Coastguard Worker LangSetWindowText(*this, IDD_BENCH);
455*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
456*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItems_RemoveColon(*this, kLangIDs_RemoveColon, Z7_ARRAY_SIZE(kLangIDs_RemoveColon));
457*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItemText(*this, IDT_BENCH_CURRENT2, IDT_BENCH_CURRENT);
458*f6dc9357SAndroid Build Coastguard Worker LangSetDlgItemText(*this, IDT_BENCH_RESULTING2, IDT_BENCH_RESULTING);
459*f6dc9357SAndroid Build Coastguard Worker #endif
460*f6dc9357SAndroid Build Coastguard Worker
461*f6dc9357SAndroid Build Coastguard Worker InitSyncNew();
462*f6dc9357SAndroid Build Coastguard Worker
463*f6dc9357SAndroid Build Coastguard Worker if (TotalMode)
464*f6dc9357SAndroid Build Coastguard Worker {
465*f6dc9357SAndroid Build Coastguard Worker _consoleEdit.Attach(GetItem(IDE_BENCH2_EDIT));
466*f6dc9357SAndroid Build Coastguard Worker LOGFONT f;
467*f6dc9357SAndroid Build Coastguard Worker memset(&f, 0, sizeof(f));
468*f6dc9357SAndroid Build Coastguard Worker f.lfHeight = 14;
469*f6dc9357SAndroid Build Coastguard Worker f.lfWidth = 0;
470*f6dc9357SAndroid Build Coastguard Worker f.lfWeight = FW_DONTCARE;
471*f6dc9357SAndroid Build Coastguard Worker f.lfCharSet = DEFAULT_CHARSET;
472*f6dc9357SAndroid Build Coastguard Worker f.lfOutPrecision = OUT_DEFAULT_PRECIS;
473*f6dc9357SAndroid Build Coastguard Worker f.lfClipPrecision = CLIP_DEFAULT_PRECIS;
474*f6dc9357SAndroid Build Coastguard Worker f.lfQuality = DEFAULT_QUALITY;
475*f6dc9357SAndroid Build Coastguard Worker
476*f6dc9357SAndroid Build Coastguard Worker f.lfPitchAndFamily = FIXED_PITCH;
477*f6dc9357SAndroid Build Coastguard Worker // MyStringCopy(f.lfFaceName, TEXT(""));
478*f6dc9357SAndroid Build Coastguard Worker // f.lfFaceName[0] = 0;
479*f6dc9357SAndroid Build Coastguard Worker _font.Create(&f);
480*f6dc9357SAndroid Build Coastguard Worker if (_font._font)
481*f6dc9357SAndroid Build Coastguard Worker _consoleEdit.SendMsg(WM_SETFONT, (WPARAM)_font._font, TRUE);
482*f6dc9357SAndroid Build Coastguard Worker }
483*f6dc9357SAndroid Build Coastguard Worker
484*f6dc9357SAndroid Build Coastguard Worker UInt32 numCPUs = 1;
485*f6dc9357SAndroid Build Coastguard Worker
486*f6dc9357SAndroid Build Coastguard Worker {
487*f6dc9357SAndroid Build Coastguard Worker AString s ("/ ");
488*f6dc9357SAndroid Build Coastguard Worker
489*f6dc9357SAndroid Build Coastguard Worker NSystem::CProcessAffinity threadsInfo;
490*f6dc9357SAndroid Build Coastguard Worker threadsInfo.InitST();
491*f6dc9357SAndroid Build Coastguard Worker
492*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
493*f6dc9357SAndroid Build Coastguard Worker if (threadsInfo.Get() && threadsInfo.processAffinityMask != 0)
494*f6dc9357SAndroid Build Coastguard Worker numCPUs = threadsInfo.GetNumProcessThreads();
495*f6dc9357SAndroid Build Coastguard Worker else
496*f6dc9357SAndroid Build Coastguard Worker numCPUs = NSystem::GetNumberOfProcessors();
497*f6dc9357SAndroid Build Coastguard Worker #endif
498*f6dc9357SAndroid Build Coastguard Worker
499*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(numCPUs);
500*f6dc9357SAndroid Build Coastguard Worker s += GetProcessThreadsInfo(threadsInfo);
501*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_HARDWARE_THREADS, s);
502*f6dc9357SAndroid Build Coastguard Worker
503*f6dc9357SAndroid Build Coastguard Worker {
504*f6dc9357SAndroid Build Coastguard Worker AString s2;
505*f6dc9357SAndroid Build Coastguard Worker GetSysInfo(s, s2);
506*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_SYS1, s);
507*f6dc9357SAndroid Build Coastguard Worker if (s != s2 && !s2.IsEmpty())
508*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_SYS2, s2);
509*f6dc9357SAndroid Build Coastguard Worker }
510*f6dc9357SAndroid Build Coastguard Worker {
511*f6dc9357SAndroid Build Coastguard Worker AString registers;
512*f6dc9357SAndroid Build Coastguard Worker GetCpuName_MultiLine(s, registers);
513*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_CPU, s);
514*f6dc9357SAndroid Build Coastguard Worker }
515*f6dc9357SAndroid Build Coastguard Worker {
516*f6dc9357SAndroid Build Coastguard Worker GetOsInfoText(s);
517*f6dc9357SAndroid Build Coastguard Worker s += " : ";
518*f6dc9357SAndroid Build Coastguard Worker AddCpuFeatures(s);
519*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_CPU_FEATURE, s);
520*f6dc9357SAndroid Build Coastguard Worker }
521*f6dc9357SAndroid Build Coastguard Worker
522*f6dc9357SAndroid Build Coastguard Worker s = "7-Zip " MY_VERSION_CPU;
523*f6dc9357SAndroid Build Coastguard Worker SetItemTextA(IDT_BENCH_VER, s);
524*f6dc9357SAndroid Build Coastguard Worker }
525*f6dc9357SAndroid Build Coastguard Worker
526*f6dc9357SAndroid Build Coastguard Worker
527*f6dc9357SAndroid Build Coastguard Worker // ----- Num Threads ----------
528*f6dc9357SAndroid Build Coastguard Worker
529*f6dc9357SAndroid Build Coastguard Worker if (numCPUs < 1)
530*f6dc9357SAndroid Build Coastguard Worker numCPUs = 1;
531*f6dc9357SAndroid Build Coastguard Worker numCPUs = MyMin(numCPUs, (UInt32)(1 << 6)); // it's WIN32 limit
532*f6dc9357SAndroid Build Coastguard Worker
533*f6dc9357SAndroid Build Coastguard Worker UInt32 numThreads = Sync.NumThreads;
534*f6dc9357SAndroid Build Coastguard Worker
535*f6dc9357SAndroid Build Coastguard Worker if (numThreads == (UInt32)(Int32)-1)
536*f6dc9357SAndroid Build Coastguard Worker numThreads = numCPUs;
537*f6dc9357SAndroid Build Coastguard Worker if (numThreads > 1)
538*f6dc9357SAndroid Build Coastguard Worker numThreads &= ~(UInt32)1;
539*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNumThreadsMax = (1 << 12);
540*f6dc9357SAndroid Build Coastguard Worker if (numThreads > kNumThreadsMax)
541*f6dc9357SAndroid Build Coastguard Worker numThreads = kNumThreadsMax;
542*f6dc9357SAndroid Build Coastguard Worker
543*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.Attach(GetItem(IDC_BENCH_NUM_THREADS));
544*f6dc9357SAndroid Build Coastguard Worker const UInt32 numTheads_Combo = numCPUs * 2;
545*f6dc9357SAndroid Build Coastguard Worker UInt32 v = 1;
546*f6dc9357SAndroid Build Coastguard Worker int cur = 0;
547*f6dc9357SAndroid Build Coastguard Worker for (; v <= numTheads_Combo;)
548*f6dc9357SAndroid Build Coastguard Worker {
549*f6dc9357SAndroid Build Coastguard Worker int index = ComboBox_Add_UInt32(m_NumThreads, v);
550*f6dc9357SAndroid Build Coastguard Worker const UInt32 vNext = v + (v < 2 ? 1 : 2);
551*f6dc9357SAndroid Build Coastguard Worker if (v <= numThreads)
552*f6dc9357SAndroid Build Coastguard Worker if (numThreads < vNext || vNext > numTheads_Combo)
553*f6dc9357SAndroid Build Coastguard Worker {
554*f6dc9357SAndroid Build Coastguard Worker if (v != numThreads)
555*f6dc9357SAndroid Build Coastguard Worker index = ComboBox_Add_UInt32(m_NumThreads, numThreads);
556*f6dc9357SAndroid Build Coastguard Worker cur = index;
557*f6dc9357SAndroid Build Coastguard Worker }
558*f6dc9357SAndroid Build Coastguard Worker v = vNext;
559*f6dc9357SAndroid Build Coastguard Worker }
560*f6dc9357SAndroid Build Coastguard Worker m_NumThreads.SetCurSel(cur);
561*f6dc9357SAndroid Build Coastguard Worker Sync.NumThreads = GetNumberOfThreads();
562*f6dc9357SAndroid Build Coastguard Worker
563*f6dc9357SAndroid Build Coastguard Worker
564*f6dc9357SAndroid Build Coastguard Worker // ----- Dictionary ----------
565*f6dc9357SAndroid Build Coastguard Worker
566*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.Attach(GetItem(IDC_BENCH_DICTIONARY));
567*f6dc9357SAndroid Build Coastguard Worker
568*f6dc9357SAndroid Build Coastguard Worker RamSize = (UInt64)(sizeof(size_t)) << 29;
569*f6dc9357SAndroid Build Coastguard Worker RamSize_Defined = NSystem::GetRamSize(RamSize);
570*f6dc9357SAndroid Build Coastguard Worker
571*f6dc9357SAndroid Build Coastguard Worker
572*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
573*f6dc9357SAndroid Build Coastguard Worker const UInt32 kNormalizedCeSize = (16 << 20);
574*f6dc9357SAndroid Build Coastguard Worker if (RamSize > kNormalizedCeSize && RamSize < (33 << 20))
575*f6dc9357SAndroid Build Coastguard Worker RamSize = kNormalizedCeSize;
576*f6dc9357SAndroid Build Coastguard Worker #endif
577*f6dc9357SAndroid Build Coastguard Worker RamSize_Limit = RamSize / 16 * 15;
578*f6dc9357SAndroid Build Coastguard Worker
579*f6dc9357SAndroid Build Coastguard Worker if (Sync.DictSize == (UInt64)(Int64)-1)
580*f6dc9357SAndroid Build Coastguard Worker {
581*f6dc9357SAndroid Build Coastguard Worker unsigned dicSizeLog = 25;
582*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
583*f6dc9357SAndroid Build Coastguard Worker dicSizeLog = 20;
584*f6dc9357SAndroid Build Coastguard Worker #endif
585*f6dc9357SAndroid Build Coastguard Worker if (RamSize_Defined)
586*f6dc9357SAndroid Build Coastguard Worker for (; dicSizeLog > kBenchMinDicLogSize; dicSizeLog--)
587*f6dc9357SAndroid Build Coastguard Worker if (IsMemoryUsageOK(GetBenchMemoryUsage(
588*f6dc9357SAndroid Build Coastguard Worker Sync.NumThreads, Sync.Level, (UInt64)1 << dicSizeLog, TotalMode)))
589*f6dc9357SAndroid Build Coastguard Worker break;
590*f6dc9357SAndroid Build Coastguard Worker Sync.DictSize = (UInt64)1 << dicSizeLog;
591*f6dc9357SAndroid Build Coastguard Worker }
592*f6dc9357SAndroid Build Coastguard Worker
593*f6dc9357SAndroid Build Coastguard Worker if (Sync.DictSize < kMinDicSize) Sync.DictSize = kMinDicSize;
594*f6dc9357SAndroid Build Coastguard Worker if (Sync.DictSize > kMaxDicSize) Sync.DictSize = kMaxDicSize;
595*f6dc9357SAndroid Build Coastguard Worker
596*f6dc9357SAndroid Build Coastguard Worker cur = 0;
597*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = (kMinDicLogSize - 1) * 2; i <= (32 - 1) * 2; i++)
598*f6dc9357SAndroid Build Coastguard Worker {
599*f6dc9357SAndroid Build Coastguard Worker const size_t dict = (size_t)(2 + (i & 1)) << (i / 2);
600*f6dc9357SAndroid Build Coastguard Worker // if (i == (32 - 1) * 2) dict = kMaxDicSize;
601*f6dc9357SAndroid Build Coastguard Worker TCHAR s[32];
602*f6dc9357SAndroid Build Coastguard Worker const TCHAR *post;
603*f6dc9357SAndroid Build Coastguard Worker UInt32 d;
604*f6dc9357SAndroid Build Coastguard Worker if (dict >= ((UInt32)1 << 31)) { d = (UInt32)(dict >> 30); post = kGB; }
605*f6dc9357SAndroid Build Coastguard Worker else if (dict >= ((UInt32)1 << 21)) { d = (UInt32)(dict >> 20); post = kMB; }
606*f6dc9357SAndroid Build Coastguard Worker else { d = (UInt32)(dict >> 10); post = kKB; }
607*f6dc9357SAndroid Build Coastguard Worker ConvertUInt32ToString(d, s);
608*f6dc9357SAndroid Build Coastguard Worker lstrcat(s, post);
609*f6dc9357SAndroid Build Coastguard Worker const int index = (int)m_Dictionary.AddString(s);
610*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetItemData(index, (LPARAM)dict);
611*f6dc9357SAndroid Build Coastguard Worker if (dict <= Sync.DictSize)
612*f6dc9357SAndroid Build Coastguard Worker cur = index;
613*f6dc9357SAndroid Build Coastguard Worker if (dict >= kMaxDicSize)
614*f6dc9357SAndroid Build Coastguard Worker break;
615*f6dc9357SAndroid Build Coastguard Worker }
616*f6dc9357SAndroid Build Coastguard Worker m_Dictionary.SetCurSel(cur);
617*f6dc9357SAndroid Build Coastguard Worker
618*f6dc9357SAndroid Build Coastguard Worker
619*f6dc9357SAndroid Build Coastguard Worker // ----- Num Passes ----------
620*f6dc9357SAndroid Build Coastguard Worker
621*f6dc9357SAndroid Build Coastguard Worker m_NumPasses.Attach(GetItem(IDC_BENCH_NUM_PASSES));
622*f6dc9357SAndroid Build Coastguard Worker cur = 0;
623*f6dc9357SAndroid Build Coastguard Worker v = 1;
624*f6dc9357SAndroid Build Coastguard Worker for (;;)
625*f6dc9357SAndroid Build Coastguard Worker {
626*f6dc9357SAndroid Build Coastguard Worker int index = ComboBox_Add_UInt32(m_NumPasses, v);
627*f6dc9357SAndroid Build Coastguard Worker const bool isLast = (v >= 10000000);
628*f6dc9357SAndroid Build Coastguard Worker UInt32 vNext = v * 10;
629*f6dc9357SAndroid Build Coastguard Worker if (v < 2) vNext = 2;
630*f6dc9357SAndroid Build Coastguard Worker else if (v < 5) vNext = 5;
631*f6dc9357SAndroid Build Coastguard Worker else if (v < 10) vNext = 10;
632*f6dc9357SAndroid Build Coastguard Worker
633*f6dc9357SAndroid Build Coastguard Worker if (v <= Sync.NumPasses_Limit)
634*f6dc9357SAndroid Build Coastguard Worker if (isLast || Sync.NumPasses_Limit < vNext)
635*f6dc9357SAndroid Build Coastguard Worker {
636*f6dc9357SAndroid Build Coastguard Worker if (v != Sync.NumPasses_Limit)
637*f6dc9357SAndroid Build Coastguard Worker index = ComboBox_Add_UInt32(m_NumPasses, Sync.NumPasses_Limit);
638*f6dc9357SAndroid Build Coastguard Worker cur = index;
639*f6dc9357SAndroid Build Coastguard Worker }
640*f6dc9357SAndroid Build Coastguard Worker v = vNext;
641*f6dc9357SAndroid Build Coastguard Worker if (isLast)
642*f6dc9357SAndroid Build Coastguard Worker break;
643*f6dc9357SAndroid Build Coastguard Worker }
644*f6dc9357SAndroid Build Coastguard Worker m_NumPasses.SetCurSel(cur);
645*f6dc9357SAndroid Build Coastguard Worker
646*f6dc9357SAndroid Build Coastguard Worker if (TotalMode)
647*f6dc9357SAndroid Build Coastguard Worker NormalizeSize(true);
648*f6dc9357SAndroid Build Coastguard Worker else
649*f6dc9357SAndroid Build Coastguard Worker NormalizePosition();
650*f6dc9357SAndroid Build Coastguard Worker
651*f6dc9357SAndroid Build Coastguard Worker RestartBenchmark();
652*f6dc9357SAndroid Build Coastguard Worker
653*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnInit();
654*f6dc9357SAndroid Build Coastguard Worker }
655*f6dc9357SAndroid Build Coastguard Worker
656*f6dc9357SAndroid Build Coastguard Worker
OnSize(WPARAM,int xSize,int ySize)657*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnSize(WPARAM /* wParam */, int xSize, int ySize)
658*f6dc9357SAndroid Build Coastguard Worker {
659*f6dc9357SAndroid Build Coastguard Worker int mx, my;
660*f6dc9357SAndroid Build Coastguard Worker GetMargins(8, mx, my);
661*f6dc9357SAndroid Build Coastguard Worker
662*f6dc9357SAndroid Build Coastguard Worker if (!TotalMode)
663*f6dc9357SAndroid Build Coastguard Worker {
664*f6dc9357SAndroid Build Coastguard Worker RECT rect;
665*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDT_BENCH_LOG, rect);
666*f6dc9357SAndroid Build Coastguard Worker int x = xSize - rect.left - mx;
667*f6dc9357SAndroid Build Coastguard Worker int y = ySize - rect.top - my;
668*f6dc9357SAndroid Build Coastguard Worker if (x < 0) x = 0;
669*f6dc9357SAndroid Build Coastguard Worker if (y < 0) y = 0;
670*f6dc9357SAndroid Build Coastguard Worker MoveItem(IDT_BENCH_LOG, rect.left, rect.top, x, y, true);
671*f6dc9357SAndroid Build Coastguard Worker return false;
672*f6dc9357SAndroid Build Coastguard Worker }
673*f6dc9357SAndroid Build Coastguard Worker
674*f6dc9357SAndroid Build Coastguard Worker int bx1, bx2, by;
675*f6dc9357SAndroid Build Coastguard Worker
676*f6dc9357SAndroid Build Coastguard Worker GetItemSizes(IDCANCEL, bx1, by);
677*f6dc9357SAndroid Build Coastguard Worker GetItemSizes(IDHELP, bx2, by);
678*f6dc9357SAndroid Build Coastguard Worker
679*f6dc9357SAndroid Build Coastguard Worker {
680*f6dc9357SAndroid Build Coastguard Worker int y = ySize - my - by;
681*f6dc9357SAndroid Build Coastguard Worker int x = xSize - mx - bx1;
682*f6dc9357SAndroid Build Coastguard Worker
683*f6dc9357SAndroid Build Coastguard Worker InvalidateRect(NULL);
684*f6dc9357SAndroid Build Coastguard Worker
685*f6dc9357SAndroid Build Coastguard Worker MoveItem(IDCANCEL, x, y, bx1, by);
686*f6dc9357SAndroid Build Coastguard Worker MoveItem(IDHELP, x - mx - bx2, y, bx2, by);
687*f6dc9357SAndroid Build Coastguard Worker }
688*f6dc9357SAndroid Build Coastguard Worker
689*f6dc9357SAndroid Build Coastguard Worker if (_consoleEdit)
690*f6dc9357SAndroid Build Coastguard Worker {
691*f6dc9357SAndroid Build Coastguard Worker int yPos = ySize - my - by;
692*f6dc9357SAndroid Build Coastguard Worker RECT rect;
693*f6dc9357SAndroid Build Coastguard Worker GetClientRectOfItem(IDE_BENCH2_EDIT, rect);
694*f6dc9357SAndroid Build Coastguard Worker int y = rect.top;
695*f6dc9357SAndroid Build Coastguard Worker int ySize2 = yPos - my - y;
696*f6dc9357SAndroid Build Coastguard Worker const int kMinYSize = 20;
697*f6dc9357SAndroid Build Coastguard Worker int xx = xSize - mx * 2;
698*f6dc9357SAndroid Build Coastguard Worker if (ySize2 < kMinYSize)
699*f6dc9357SAndroid Build Coastguard Worker {
700*f6dc9357SAndroid Build Coastguard Worker ySize2 = kMinYSize;
701*f6dc9357SAndroid Build Coastguard Worker }
702*f6dc9357SAndroid Build Coastguard Worker _consoleEdit.Move(mx, y, xx, ySize2);
703*f6dc9357SAndroid Build Coastguard Worker }
704*f6dc9357SAndroid Build Coastguard Worker return false;
705*f6dc9357SAndroid Build Coastguard Worker }
706*f6dc9357SAndroid Build Coastguard Worker
707*f6dc9357SAndroid Build Coastguard Worker
GetNumberOfThreads()708*f6dc9357SAndroid Build Coastguard Worker UInt32 CBenchmarkDialog::GetNumberOfThreads()
709*f6dc9357SAndroid Build Coastguard Worker {
710*f6dc9357SAndroid Build Coastguard Worker return (UInt32)m_NumThreads.GetItemData_of_CurSel();
711*f6dc9357SAndroid Build Coastguard Worker }
712*f6dc9357SAndroid Build Coastguard Worker
713*f6dc9357SAndroid Build Coastguard Worker
714*f6dc9357SAndroid Build Coastguard Worker #define UINT_TO_STR_3(s, val) { \
715*f6dc9357SAndroid Build Coastguard Worker s[0] = (wchar_t)('0' + (val) / 100); \
716*f6dc9357SAndroid Build Coastguard Worker s[1] = (wchar_t)('0' + (val) % 100 / 10); \
717*f6dc9357SAndroid Build Coastguard Worker s[2] = (wchar_t)('0' + (val) % 10); \
718*f6dc9357SAndroid Build Coastguard Worker s += 3; s[0] = 0; }
719*f6dc9357SAndroid Build Coastguard Worker
NumberToDot3(UInt64 val,WCHAR * s)720*f6dc9357SAndroid Build Coastguard Worker static WCHAR *NumberToDot3(UInt64 val, WCHAR *s)
721*f6dc9357SAndroid Build Coastguard Worker {
722*f6dc9357SAndroid Build Coastguard Worker s = ConvertUInt64ToString(val / 1000, s);
723*f6dc9357SAndroid Build Coastguard Worker const UInt32 rem = (UInt32)(val % 1000);
724*f6dc9357SAndroid Build Coastguard Worker *s++ = '.';
725*f6dc9357SAndroid Build Coastguard Worker UINT_TO_STR_3(s, rem)
726*f6dc9357SAndroid Build Coastguard Worker return s;
727*f6dc9357SAndroid Build Coastguard Worker }
728*f6dc9357SAndroid Build Coastguard Worker
SetItemText_Number(unsigned itemID,UInt64 val,LPCTSTR post)729*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::SetItemText_Number(unsigned itemID, UInt64 val, LPCTSTR post)
730*f6dc9357SAndroid Build Coastguard Worker {
731*f6dc9357SAndroid Build Coastguard Worker TCHAR s[64];
732*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(val, s);
733*f6dc9357SAndroid Build Coastguard Worker if (post)
734*f6dc9357SAndroid Build Coastguard Worker lstrcat(s, post);
735*f6dc9357SAndroid Build Coastguard Worker SetItemText(itemID, s);
736*f6dc9357SAndroid Build Coastguard Worker }
737*f6dc9357SAndroid Build Coastguard Worker
AddSize_MB(UString & s,UInt64 size)738*f6dc9357SAndroid Build Coastguard Worker static void AddSize_MB(UString &s, UInt64 size)
739*f6dc9357SAndroid Build Coastguard Worker {
740*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64((size + (1 << 20) - 1) >> 20);
741*f6dc9357SAndroid Build Coastguard Worker s += kMB;
742*f6dc9357SAndroid Build Coastguard Worker }
743*f6dc9357SAndroid Build Coastguard Worker
Print_MemUsage(UString & s,UInt64 memUsage) const744*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::Print_MemUsage(UString &s, UInt64 memUsage) const
745*f6dc9357SAndroid Build Coastguard Worker {
746*f6dc9357SAndroid Build Coastguard Worker AddSize_MB(s, memUsage);
747*f6dc9357SAndroid Build Coastguard Worker if (RamSize_Defined)
748*f6dc9357SAndroid Build Coastguard Worker {
749*f6dc9357SAndroid Build Coastguard Worker s += " / ";
750*f6dc9357SAndroid Build Coastguard Worker AddSize_MB(s, RamSize);
751*f6dc9357SAndroid Build Coastguard Worker }
752*f6dc9357SAndroid Build Coastguard Worker }
753*f6dc9357SAndroid Build Coastguard Worker
OnChangeDictionary()754*f6dc9357SAndroid Build Coastguard Worker size_t CBenchmarkDialog::OnChangeDictionary()
755*f6dc9357SAndroid Build Coastguard Worker {
756*f6dc9357SAndroid Build Coastguard Worker const size_t dict = (size_t)m_Dictionary.GetItemData_of_CurSel();
757*f6dc9357SAndroid Build Coastguard Worker const UInt64 memUsage = GetBenchMemoryUsage(GetNumberOfThreads(),
758*f6dc9357SAndroid Build Coastguard Worker Sync.Level,
759*f6dc9357SAndroid Build Coastguard Worker dict,
760*f6dc9357SAndroid Build Coastguard Worker false); // totalBench mode
761*f6dc9357SAndroid Build Coastguard Worker
762*f6dc9357SAndroid Build Coastguard Worker UString s;
763*f6dc9357SAndroid Build Coastguard Worker Print_MemUsage(s, memUsage);
764*f6dc9357SAndroid Build Coastguard Worker
765*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_LARGE_PAGES
766*f6dc9357SAndroid Build Coastguard Worker {
767*f6dc9357SAndroid Build Coastguard Worker AString s2;
768*f6dc9357SAndroid Build Coastguard Worker Add_LargePages_String(s2);
769*f6dc9357SAndroid Build Coastguard Worker if (!s2.IsEmpty())
770*f6dc9357SAndroid Build Coastguard Worker {
771*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
772*f6dc9357SAndroid Build Coastguard Worker s += s2;
773*f6dc9357SAndroid Build Coastguard Worker }
774*f6dc9357SAndroid Build Coastguard Worker }
775*f6dc9357SAndroid Build Coastguard Worker #endif
776*f6dc9357SAndroid Build Coastguard Worker
777*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_BENCH_MEMORY_VAL, s);
778*f6dc9357SAndroid Build Coastguard Worker
779*f6dc9357SAndroid Build Coastguard Worker return dict;
780*f6dc9357SAndroid Build Coastguard Worker }
781*f6dc9357SAndroid Build Coastguard Worker
782*f6dc9357SAndroid Build Coastguard Worker
783*f6dc9357SAndroid Build Coastguard Worker static const UInt32 g_IDs[] =
784*f6dc9357SAndroid Build Coastguard Worker {
785*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SIZE1,
786*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SIZE2,
787*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_USAGE1,
788*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_USAGE2,
789*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SPEED1,
790*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SPEED2,
791*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RATING1,
792*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RATING2,
793*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RPU1,
794*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RPU2,
795*f6dc9357SAndroid Build Coastguard Worker
796*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SIZE1,
797*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SIZE2,
798*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SPEED1,
799*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SPEED2,
800*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RATING1,
801*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RATING2,
802*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_USAGE1,
803*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_USAGE2,
804*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RPU1,
805*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RPU2,
806*f6dc9357SAndroid Build Coastguard Worker
807*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_USAGE_VAL,
808*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_RATING_VAL,
809*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_RPU_VAL
810*f6dc9357SAndroid Build Coastguard Worker };
811*f6dc9357SAndroid Build Coastguard Worker
812*f6dc9357SAndroid Build Coastguard Worker
813*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Enc_1[] = {
814*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_USAGE1,
815*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SPEED1,
816*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RPU1,
817*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RATING1,
818*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SIZE1 };
819*f6dc9357SAndroid Build Coastguard Worker
820*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Enc[] = {
821*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_USAGE2,
822*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SPEED2,
823*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RPU2,
824*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_RATING2,
825*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_COMPRESS_SIZE2 };
826*f6dc9357SAndroid Build Coastguard Worker
827*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Dec_1[] = {
828*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_USAGE1,
829*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SPEED1,
830*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RPU1,
831*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RATING1,
832*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SIZE1 };
833*f6dc9357SAndroid Build Coastguard Worker
834*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Dec[] = {
835*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_USAGE2,
836*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SPEED2,
837*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RPU2,
838*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_RATING2,
839*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_DECOMPR_SIZE2 };
840*f6dc9357SAndroid Build Coastguard Worker
841*f6dc9357SAndroid Build Coastguard Worker static const unsigned k_Ids_Tot[] = {
842*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_USAGE_VAL,
843*f6dc9357SAndroid Build Coastguard Worker 0,
844*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_RPU_VAL,
845*f6dc9357SAndroid Build Coastguard Worker IDT_BENCH_TOTAL_RATING_VAL,
846*f6dc9357SAndroid Build Coastguard Worker 0 };
847*f6dc9357SAndroid Build Coastguard Worker
848*f6dc9357SAndroid Build Coastguard Worker
MyKillTimer()849*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::MyKillTimer()
850*f6dc9357SAndroid Build Coastguard Worker {
851*f6dc9357SAndroid Build Coastguard Worker if (_timer != 0)
852*f6dc9357SAndroid Build Coastguard Worker {
853*f6dc9357SAndroid Build Coastguard Worker KillTimer(kTimerID);
854*f6dc9357SAndroid Build Coastguard Worker _timer = 0;
855*f6dc9357SAndroid Build Coastguard Worker }
856*f6dc9357SAndroid Build Coastguard Worker }
857*f6dc9357SAndroid Build Coastguard Worker
858*f6dc9357SAndroid Build Coastguard Worker
OnDestroy()859*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnDestroy()
860*f6dc9357SAndroid Build Coastguard Worker {
861*f6dc9357SAndroid Build Coastguard Worker /* actually timer was removed before.
862*f6dc9357SAndroid Build Coastguard Worker also the timer must be removed by Windows, when window will be removed. */
863*f6dc9357SAndroid Build Coastguard Worker MyKillTimer(); // it's optional code
864*f6dc9357SAndroid Build Coastguard Worker return false; // we return (false) to perform default dialog operation
865*f6dc9357SAndroid Build Coastguard Worker }
866*f6dc9357SAndroid Build Coastguard Worker
867*f6dc9357SAndroid Build Coastguard Worker void SetErrorMessage_MemUsage(UString &s, UInt64 reqSize, UInt64 ramSize, UInt64 ramLimit, const UString &usageString);
868*f6dc9357SAndroid Build Coastguard Worker
StartBenchmark()869*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::StartBenchmark()
870*f6dc9357SAndroid Build Coastguard Worker {
871*f6dc9357SAndroid Build Coastguard Worker NeedRestart = false;
872*f6dc9357SAndroid Build Coastguard Worker WasStopped_in_GUI = false;
873*f6dc9357SAndroid Build Coastguard Worker
874*f6dc9357SAndroid Build Coastguard Worker SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
875*f6dc9357SAndroid Build Coastguard Worker
876*f6dc9357SAndroid Build Coastguard Worker MyKillTimer(); // optional code. timer was killed before
877*f6dc9357SAndroid Build Coastguard Worker
878*f6dc9357SAndroid Build Coastguard Worker const size_t dict = OnChangeDictionary();
879*f6dc9357SAndroid Build Coastguard Worker const UInt32 numThreads = GetNumberOfThreads();
880*f6dc9357SAndroid Build Coastguard Worker const UInt32 numPasses = (UInt32)m_NumPasses.GetItemData_of_CurSel();
881*f6dc9357SAndroid Build Coastguard Worker
882*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_IDs); i++)
883*f6dc9357SAndroid Build Coastguard Worker SetItemText(g_IDs[i], kProcessingString);
884*f6dc9357SAndroid Build Coastguard Worker
885*f6dc9357SAndroid Build Coastguard Worker SetItemText_Empty(IDT_BENCH_LOG);
886*f6dc9357SAndroid Build Coastguard Worker SetItemText_Empty(IDT_BENCH_ELAPSED_VAL);
887*f6dc9357SAndroid Build Coastguard Worker SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
888*f6dc9357SAndroid Build Coastguard Worker
889*f6dc9357SAndroid Build Coastguard Worker const UInt64 memUsage = GetBenchMemoryUsage(numThreads, Sync.Level, dict,
890*f6dc9357SAndroid Build Coastguard Worker false); // totalBench
891*f6dc9357SAndroid Build Coastguard Worker if (!IsMemoryUsageOK(memUsage))
892*f6dc9357SAndroid Build Coastguard Worker {
893*f6dc9357SAndroid Build Coastguard Worker UString s2;
894*f6dc9357SAndroid Build Coastguard Worker LangString_OnlyFromLangFile(IDS_MEM_REQUIRED_MEM_SIZE, s2);
895*f6dc9357SAndroid Build Coastguard Worker if (s2.IsEmpty())
896*f6dc9357SAndroid Build Coastguard Worker {
897*f6dc9357SAndroid Build Coastguard Worker s2 = LangString(IDT_BENCH_MEMORY);
898*f6dc9357SAndroid Build Coastguard Worker if (s2.IsEmpty())
899*f6dc9357SAndroid Build Coastguard Worker GetItemText(IDT_BENCH_MEMORY, s2);
900*f6dc9357SAndroid Build Coastguard Worker s2.RemoveChar(L':');
901*f6dc9357SAndroid Build Coastguard Worker }
902*f6dc9357SAndroid Build Coastguard Worker UString s;
903*f6dc9357SAndroid Build Coastguard Worker SetErrorMessage_MemUsage(s, memUsage, RamSize, RamSize_Limit, s2);
904*f6dc9357SAndroid Build Coastguard Worker MessageBoxError_Status(s);
905*f6dc9357SAndroid Build Coastguard Worker return;
906*f6dc9357SAndroid Build Coastguard Worker }
907*f6dc9357SAndroid Build Coastguard Worker
908*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDB_STOP, true);
909*f6dc9357SAndroid Build Coastguard Worker
910*f6dc9357SAndroid Build Coastguard Worker _startTime = GetTickCount();
911*f6dc9357SAndroid Build Coastguard Worker _finishTime = _startTime;
912*f6dc9357SAndroid Build Coastguard Worker _finishTime_WasSet = false;
913*f6dc9357SAndroid Build Coastguard Worker
914*f6dc9357SAndroid Build Coastguard Worker {
915*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
916*f6dc9357SAndroid Build Coastguard Worker InitSyncNew();
917*f6dc9357SAndroid Build Coastguard Worker Sync.DictSize = dict;
918*f6dc9357SAndroid Build Coastguard Worker Sync.NumThreads = numThreads;
919*f6dc9357SAndroid Build Coastguard Worker Sync.NumPasses_Limit = numPasses;
920*f6dc9357SAndroid Build Coastguard Worker }
921*f6dc9357SAndroid Build Coastguard Worker
922*f6dc9357SAndroid Build Coastguard Worker PrintTime();
923*f6dc9357SAndroid Build Coastguard Worker
924*f6dc9357SAndroid Build Coastguard Worker _timer = SetTimer(kTimerID, kTimerElapse);
925*f6dc9357SAndroid Build Coastguard Worker if (_thread.Create(CThreadBenchmark::MyThreadFunction, &_threadBenchmark) != 0)
926*f6dc9357SAndroid Build Coastguard Worker {
927*f6dc9357SAndroid Build Coastguard Worker MyKillTimer();
928*f6dc9357SAndroid Build Coastguard Worker MessageBoxError_Status(L"Can't create thread");
929*f6dc9357SAndroid Build Coastguard Worker }
930*f6dc9357SAndroid Build Coastguard Worker return;
931*f6dc9357SAndroid Build Coastguard Worker }
932*f6dc9357SAndroid Build Coastguard Worker
933*f6dc9357SAndroid Build Coastguard Worker
RestartBenchmark()934*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::RestartBenchmark()
935*f6dc9357SAndroid Build Coastguard Worker {
936*f6dc9357SAndroid Build Coastguard Worker if (ExitWasAsked_in_GUI)
937*f6dc9357SAndroid Build Coastguard Worker return;
938*f6dc9357SAndroid Build Coastguard Worker
939*f6dc9357SAndroid Build Coastguard Worker if (_thread.IsCreated())
940*f6dc9357SAndroid Build Coastguard Worker {
941*f6dc9357SAndroid Build Coastguard Worker NeedRestart = true;
942*f6dc9357SAndroid Build Coastguard Worker SendExit_Status(L"Stop for restart ...");
943*f6dc9357SAndroid Build Coastguard Worker }
944*f6dc9357SAndroid Build Coastguard Worker else
945*f6dc9357SAndroid Build Coastguard Worker StartBenchmark();
946*f6dc9357SAndroid Build Coastguard Worker }
947*f6dc9357SAndroid Build Coastguard Worker
948*f6dc9357SAndroid Build Coastguard Worker
Disable_Stop_Button()949*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::Disable_Stop_Button()
950*f6dc9357SAndroid Build Coastguard Worker {
951*f6dc9357SAndroid Build Coastguard Worker // if we disable focused button, then focus will be lost
952*f6dc9357SAndroid Build Coastguard Worker if (GetFocus() == GetItem(IDB_STOP))
953*f6dc9357SAndroid Build Coastguard Worker {
954*f6dc9357SAndroid Build Coastguard Worker // SendMsg_NextDlgCtl_Prev();
955*f6dc9357SAndroid Build Coastguard Worker SendMsg_NextDlgCtl_CtlId(IDB_RESTART);
956*f6dc9357SAndroid Build Coastguard Worker }
957*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDB_STOP, false);
958*f6dc9357SAndroid Build Coastguard Worker }
959*f6dc9357SAndroid Build Coastguard Worker
960*f6dc9357SAndroid Build Coastguard Worker
OnStopButton()961*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnStopButton()
962*f6dc9357SAndroid Build Coastguard Worker {
963*f6dc9357SAndroid Build Coastguard Worker if (ExitWasAsked_in_GUI)
964*f6dc9357SAndroid Build Coastguard Worker return;
965*f6dc9357SAndroid Build Coastguard Worker
966*f6dc9357SAndroid Build Coastguard Worker Disable_Stop_Button();
967*f6dc9357SAndroid Build Coastguard Worker
968*f6dc9357SAndroid Build Coastguard Worker WasStopped_in_GUI = true;
969*f6dc9357SAndroid Build Coastguard Worker if (_thread.IsCreated())
970*f6dc9357SAndroid Build Coastguard Worker {
971*f6dc9357SAndroid Build Coastguard Worker SendExit_Status(L"Stop ...");
972*f6dc9357SAndroid Build Coastguard Worker }
973*f6dc9357SAndroid Build Coastguard Worker }
974*f6dc9357SAndroid Build Coastguard Worker
975*f6dc9357SAndroid Build Coastguard Worker
976*f6dc9357SAndroid Build Coastguard Worker
OnCancel()977*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnCancel()
978*f6dc9357SAndroid Build Coastguard Worker {
979*f6dc9357SAndroid Build Coastguard Worker ExitWasAsked_in_GUI = true;
980*f6dc9357SAndroid Build Coastguard Worker
981*f6dc9357SAndroid Build Coastguard Worker /*
982*f6dc9357SAndroid Build Coastguard Worker SendMsg_NextDlgCtl_Prev();
983*f6dc9357SAndroid Build Coastguard Worker EnableItem(IDCANCEL, false);
984*f6dc9357SAndroid Build Coastguard Worker */
985*f6dc9357SAndroid Build Coastguard Worker
986*f6dc9357SAndroid Build Coastguard Worker if (_thread.IsCreated())
987*f6dc9357SAndroid Build Coastguard Worker SendExit_Status(L"Cancel ...");
988*f6dc9357SAndroid Build Coastguard Worker else
989*f6dc9357SAndroid Build Coastguard Worker CModalDialog::OnCancel();
990*f6dc9357SAndroid Build Coastguard Worker }
991*f6dc9357SAndroid Build Coastguard Worker
992*f6dc9357SAndroid Build Coastguard Worker
OnHelp()993*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::OnHelp()
994*f6dc9357SAndroid Build Coastguard Worker {
995*f6dc9357SAndroid Build Coastguard Worker ShowHelpWindow(kHelpTopic);
996*f6dc9357SAndroid Build Coastguard Worker }
997*f6dc9357SAndroid Build Coastguard Worker
998*f6dc9357SAndroid Build Coastguard Worker
999*f6dc9357SAndroid Build Coastguard Worker
1000*f6dc9357SAndroid Build Coastguard Worker // void GetTimeString(UInt64 timeValue, wchar_t *s);
1001*f6dc9357SAndroid Build Coastguard Worker
PrintTime()1002*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintTime()
1003*f6dc9357SAndroid Build Coastguard Worker {
1004*f6dc9357SAndroid Build Coastguard Worker const UInt32 curTime =
1005*f6dc9357SAndroid Build Coastguard Worker _finishTime_WasSet ?
1006*f6dc9357SAndroid Build Coastguard Worker _finishTime :
1007*f6dc9357SAndroid Build Coastguard Worker ::GetTickCount();
1008*f6dc9357SAndroid Build Coastguard Worker
1009*f6dc9357SAndroid Build Coastguard Worker const UInt32 elapsedTime = (curTime - _startTime);
1010*f6dc9357SAndroid Build Coastguard Worker
1011*f6dc9357SAndroid Build Coastguard Worker WCHAR s[64];
1012*f6dc9357SAndroid Build Coastguard Worker
1013*f6dc9357SAndroid Build Coastguard Worker WCHAR *p = ConvertUInt32ToString(elapsedTime / 1000, s);
1014*f6dc9357SAndroid Build Coastguard Worker
1015*f6dc9357SAndroid Build Coastguard Worker if (_finishTime_WasSet)
1016*f6dc9357SAndroid Build Coastguard Worker {
1017*f6dc9357SAndroid Build Coastguard Worker *p++ = '.';
1018*f6dc9357SAndroid Build Coastguard Worker UINT_TO_STR_3(p, elapsedTime % 1000)
1019*f6dc9357SAndroid Build Coastguard Worker }
1020*f6dc9357SAndroid Build Coastguard Worker
1021*f6dc9357SAndroid Build Coastguard Worker // p = NumberToDot3((UInt64)elapsedTime, s);
1022*f6dc9357SAndroid Build Coastguard Worker
1023*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(p, L" s");
1024*f6dc9357SAndroid Build Coastguard Worker
1025*f6dc9357SAndroid Build Coastguard Worker // if (WasStopped_in_GUI) wcscat(s, L" X"); // for debug
1026*f6dc9357SAndroid Build Coastguard Worker
1027*f6dc9357SAndroid Build Coastguard Worker if (s == ElapsedSec_Prev)
1028*f6dc9357SAndroid Build Coastguard Worker return;
1029*f6dc9357SAndroid Build Coastguard Worker
1030*f6dc9357SAndroid Build Coastguard Worker ElapsedSec_Prev = s;
1031*f6dc9357SAndroid Build Coastguard Worker
1032*f6dc9357SAndroid Build Coastguard Worker // static cnt = 0; cnt++; wcscat(s, L" ");
1033*f6dc9357SAndroid Build Coastguard Worker // UString s2; s2.Add_UInt32(cnt); wcscat(s, s2.Ptr());
1034*f6dc9357SAndroid Build Coastguard Worker
1035*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_BENCH_ELAPSED_VAL, s);
1036*f6dc9357SAndroid Build Coastguard Worker }
1037*f6dc9357SAndroid Build Coastguard Worker
1038*f6dc9357SAndroid Build Coastguard Worker
GetMips(UInt64 ips)1039*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetMips(UInt64 ips)
1040*f6dc9357SAndroid Build Coastguard Worker {
1041*f6dc9357SAndroid Build Coastguard Worker return (ips + 500000) / 1000000;
1042*f6dc9357SAndroid Build Coastguard Worker }
1043*f6dc9357SAndroid Build Coastguard Worker
1044*f6dc9357SAndroid Build Coastguard Worker
GetUsagePercents(UInt64 usage)1045*f6dc9357SAndroid Build Coastguard Worker static UInt64 GetUsagePercents(UInt64 usage)
1046*f6dc9357SAndroid Build Coastguard Worker {
1047*f6dc9357SAndroid Build Coastguard Worker return Benchmark_GetUsage_Percents(usage);
1048*f6dc9357SAndroid Build Coastguard Worker }
1049*f6dc9357SAndroid Build Coastguard Worker
1050*f6dc9357SAndroid Build Coastguard Worker
GetRating(const CTotalBenchRes & info)1051*f6dc9357SAndroid Build Coastguard Worker static UInt32 GetRating(const CTotalBenchRes &info)
1052*f6dc9357SAndroid Build Coastguard Worker {
1053*f6dc9357SAndroid Build Coastguard Worker UInt64 numIter = info.NumIterations2;
1054*f6dc9357SAndroid Build Coastguard Worker if (numIter == 0)
1055*f6dc9357SAndroid Build Coastguard Worker numIter = 1000000;
1056*f6dc9357SAndroid Build Coastguard Worker const UInt64 rating64 = GetMips(info.Rating / numIter);
1057*f6dc9357SAndroid Build Coastguard Worker // return rating64;
1058*f6dc9357SAndroid Build Coastguard Worker UInt32 rating32 = (UInt32)rating64;
1059*f6dc9357SAndroid Build Coastguard Worker if (rating32 != rating64)
1060*f6dc9357SAndroid Build Coastguard Worker rating32 = (UInt32)(Int32)-1;
1061*f6dc9357SAndroid Build Coastguard Worker return rating32;
1062*f6dc9357SAndroid Build Coastguard Worker }
1063*f6dc9357SAndroid Build Coastguard Worker
1064*f6dc9357SAndroid Build Coastguard Worker
AddUsageString(UString & s,const CTotalBenchRes & info)1065*f6dc9357SAndroid Build Coastguard Worker static void AddUsageString(UString &s, const CTotalBenchRes &info)
1066*f6dc9357SAndroid Build Coastguard Worker {
1067*f6dc9357SAndroid Build Coastguard Worker UInt64 numIter = info.NumIterations2;
1068*f6dc9357SAndroid Build Coastguard Worker if (numIter == 0)
1069*f6dc9357SAndroid Build Coastguard Worker numIter = 1000000;
1070*f6dc9357SAndroid Build Coastguard Worker UInt64 usage = GetUsagePercents(info.Usage / numIter);
1071*f6dc9357SAndroid Build Coastguard Worker
1072*f6dc9357SAndroid Build Coastguard Worker wchar_t w[64];
1073*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(usage, w);
1074*f6dc9357SAndroid Build Coastguard Worker unsigned len = MyStringLen(w);
1075*f6dc9357SAndroid Build Coastguard Worker while (len < 5)
1076*f6dc9357SAndroid Build Coastguard Worker {
1077*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1078*f6dc9357SAndroid Build Coastguard Worker len++;
1079*f6dc9357SAndroid Build Coastguard Worker }
1080*f6dc9357SAndroid Build Coastguard Worker s += w;
1081*f6dc9357SAndroid Build Coastguard Worker s += "%";
1082*f6dc9357SAndroid Build Coastguard Worker }
1083*f6dc9357SAndroid Build Coastguard Worker
1084*f6dc9357SAndroid Build Coastguard Worker
Add_Dot3String(UString & s,UInt64 val)1085*f6dc9357SAndroid Build Coastguard Worker static void Add_Dot3String(UString &s, UInt64 val)
1086*f6dc9357SAndroid Build Coastguard Worker {
1087*f6dc9357SAndroid Build Coastguard Worker WCHAR temp[32];
1088*f6dc9357SAndroid Build Coastguard Worker NumberToDot3(val, temp);
1089*f6dc9357SAndroid Build Coastguard Worker s += temp;
1090*f6dc9357SAndroid Build Coastguard Worker }
1091*f6dc9357SAndroid Build Coastguard Worker
1092*f6dc9357SAndroid Build Coastguard Worker
AddRatingString(UString & s,const CTotalBenchRes & info)1093*f6dc9357SAndroid Build Coastguard Worker static void AddRatingString(UString &s, const CTotalBenchRes &info)
1094*f6dc9357SAndroid Build Coastguard Worker {
1095*f6dc9357SAndroid Build Coastguard Worker // AddUsageString(s, info);
1096*f6dc9357SAndroid Build Coastguard Worker // s.Add_Space();
1097*f6dc9357SAndroid Build Coastguard Worker // s.Add_UInt32(GetRating(info));
1098*f6dc9357SAndroid Build Coastguard Worker Add_Dot3String(s, GetRating(info));
1099*f6dc9357SAndroid Build Coastguard Worker }
1100*f6dc9357SAndroid Build Coastguard Worker
1101*f6dc9357SAndroid Build Coastguard Worker
AddRatingsLine(UString & s,const CTotalBenchRes & enc,const CTotalBenchRes & dec,DWORD ticks)1102*f6dc9357SAndroid Build Coastguard Worker static void AddRatingsLine(UString &s, const CTotalBenchRes &enc, const CTotalBenchRes &dec
1103*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1104*f6dc9357SAndroid Build Coastguard Worker , DWORD ticks
1105*f6dc9357SAndroid Build Coastguard Worker #endif
1106*f6dc9357SAndroid Build Coastguard Worker )
1107*f6dc9357SAndroid Build Coastguard Worker {
1108*f6dc9357SAndroid Build Coastguard Worker // AddUsageString(s, enc); s.Add_Space();
1109*f6dc9357SAndroid Build Coastguard Worker
1110*f6dc9357SAndroid Build Coastguard Worker AddRatingString(s, enc);
1111*f6dc9357SAndroid Build Coastguard Worker s += " ";
1112*f6dc9357SAndroid Build Coastguard Worker AddRatingString(s, dec);
1113*f6dc9357SAndroid Build Coastguard Worker
1114*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes tot_BenchRes;
1115*f6dc9357SAndroid Build Coastguard Worker tot_BenchRes.SetSum(enc, dec);
1116*f6dc9357SAndroid Build Coastguard Worker
1117*f6dc9357SAndroid Build Coastguard Worker s += " ";
1118*f6dc9357SAndroid Build Coastguard Worker AddRatingString(s, tot_BenchRes);
1119*f6dc9357SAndroid Build Coastguard Worker
1120*f6dc9357SAndroid Build Coastguard Worker s.Add_Space(); AddUsageString(s, tot_BenchRes);
1121*f6dc9357SAndroid Build Coastguard Worker
1122*f6dc9357SAndroid Build Coastguard Worker
1123*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1124*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1125*f6dc9357SAndroid Build Coastguard Worker {
1126*f6dc9357SAndroid Build Coastguard Worker Add_Dot3String(s, ticks;
1127*f6dc9357SAndroid Build Coastguard Worker s += " s";
1128*f6dc9357SAndroid Build Coastguard Worker // s.Add_UInt32(ticks); s += " ms";
1129*f6dc9357SAndroid Build Coastguard Worker }
1130*f6dc9357SAndroid Build Coastguard Worker #endif
1131*f6dc9357SAndroid Build Coastguard Worker }
1132*f6dc9357SAndroid Build Coastguard Worker
1133*f6dc9357SAndroid Build Coastguard Worker
1134*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintRating(UInt64 rating, UINT controlID)
1135*f6dc9357SAndroid Build Coastguard Worker {
1136*f6dc9357SAndroid Build Coastguard Worker // SetItemText_Number(controlID, GetMips(rating), kMIPS);
1137*f6dc9357SAndroid Build Coastguard Worker WCHAR s[64];
1138*f6dc9357SAndroid Build Coastguard Worker MyStringCopy(NumberToDot3(GetMips(rating), s), L" GIPS");
1139*f6dc9357SAndroid Build Coastguard Worker SetItemText(controlID, s);
1140*f6dc9357SAndroid Build Coastguard Worker }
1141*f6dc9357SAndroid Build Coastguard Worker
1142*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintUsage(UInt64 usage, UINT controlID)
1143*f6dc9357SAndroid Build Coastguard Worker {
1144*f6dc9357SAndroid Build Coastguard Worker SetItemText_Number(controlID, GetUsagePercents(usage), TEXT("%"));
1145*f6dc9357SAndroid Build Coastguard Worker }
1146*f6dc9357SAndroid Build Coastguard Worker
1147*f6dc9357SAndroid Build Coastguard Worker
1148*f6dc9357SAndroid Build Coastguard Worker // void SetItemText_Number
1149*f6dc9357SAndroid Build Coastguard Worker
1150*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::PrintBenchRes(
1151*f6dc9357SAndroid Build Coastguard Worker const CTotalBenchRes2 &info,
1152*f6dc9357SAndroid Build Coastguard Worker const UINT ids[])
1153*f6dc9357SAndroid Build Coastguard Worker {
1154*f6dc9357SAndroid Build Coastguard Worker if (info.NumIterations2 == 0)
1155*f6dc9357SAndroid Build Coastguard Worker return;
1156*f6dc9357SAndroid Build Coastguard Worker if (ids[1] != 0)
1157*f6dc9357SAndroid Build Coastguard Worker SetItemText_Number(ids[1], (info.Speed >> 10) / info.NumIterations2, kKBs);
1158*f6dc9357SAndroid Build Coastguard Worker PrintRating(info.Rating / info.NumIterations2, ids[3]);
1159*f6dc9357SAndroid Build Coastguard Worker PrintRating(info.RPU / info.NumIterations2, ids[2]);
1160*f6dc9357SAndroid Build Coastguard Worker PrintUsage(info.Usage / info.NumIterations2, ids[0]);
1161*f6dc9357SAndroid Build Coastguard Worker if (ids[4] != 0)
1162*f6dc9357SAndroid Build Coastguard Worker {
1163*f6dc9357SAndroid Build Coastguard Worker UInt64 val = info.UnpackSize;
1164*f6dc9357SAndroid Build Coastguard Worker LPCTSTR kPostfix;
1165*f6dc9357SAndroid Build Coastguard Worker if (val >= ((UInt64)1 << 40))
1166*f6dc9357SAndroid Build Coastguard Worker {
1167*f6dc9357SAndroid Build Coastguard Worker kPostfix = kGB;
1168*f6dc9357SAndroid Build Coastguard Worker val >>= 30;
1169*f6dc9357SAndroid Build Coastguard Worker }
1170*f6dc9357SAndroid Build Coastguard Worker else
1171*f6dc9357SAndroid Build Coastguard Worker {
1172*f6dc9357SAndroid Build Coastguard Worker kPostfix = kMB;
1173*f6dc9357SAndroid Build Coastguard Worker val >>= 20;
1174*f6dc9357SAndroid Build Coastguard Worker }
1175*f6dc9357SAndroid Build Coastguard Worker SetItemText_Number(ids[4], val, kPostfix);
1176*f6dc9357SAndroid Build Coastguard Worker }
1177*f6dc9357SAndroid Build Coastguard Worker }
1178*f6dc9357SAndroid Build Coastguard Worker
1179*f6dc9357SAndroid Build Coastguard Worker
1180*f6dc9357SAndroid Build Coastguard Worker // static UInt32 k_Message_Finished_cnt = 0;
1181*f6dc9357SAndroid Build Coastguard Worker // static UInt32 k_OnTimer_cnt = 0;
1182*f6dc9357SAndroid Build Coastguard Worker
1183*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
1184*f6dc9357SAndroid Build Coastguard Worker {
1185*f6dc9357SAndroid Build Coastguard Worker if (message != k_Message_Finished)
1186*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnMessage(message, wParam, lParam);
1187*f6dc9357SAndroid Build Coastguard Worker
1188*f6dc9357SAndroid Build Coastguard Worker {
1189*f6dc9357SAndroid Build Coastguard Worker if (wParam == k_Msg_WPARM_Thread_Finished)
1190*f6dc9357SAndroid Build Coastguard Worker {
1191*f6dc9357SAndroid Build Coastguard Worker _finishTime = GetTickCount();
1192*f6dc9357SAndroid Build Coastguard Worker _finishTime_WasSet = true;
1193*f6dc9357SAndroid Build Coastguard Worker MyKillTimer();
1194*f6dc9357SAndroid Build Coastguard Worker
1195*f6dc9357SAndroid Build Coastguard Worker if (_thread.Wait_Close() != 0)
1196*f6dc9357SAndroid Build Coastguard Worker {
1197*f6dc9357SAndroid Build Coastguard Worker MessageBoxError_Status(L"Thread Wait Error");
1198*f6dc9357SAndroid Build Coastguard Worker }
1199*f6dc9357SAndroid Build Coastguard Worker
1200*f6dc9357SAndroid Build Coastguard Worker if (!WasStopped_in_GUI)
1201*f6dc9357SAndroid Build Coastguard Worker {
1202*f6dc9357SAndroid Build Coastguard Worker WasStopped_in_GUI = true;
1203*f6dc9357SAndroid Build Coastguard Worker Disable_Stop_Button();
1204*f6dc9357SAndroid Build Coastguard Worker }
1205*f6dc9357SAndroid Build Coastguard Worker
1206*f6dc9357SAndroid Build Coastguard Worker HRESULT res = Sync.BenchFinish_Thread_HRESULT;
1207*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
1208*f6dc9357SAndroid Build Coastguard Worker // if (!ExitWasAsked_in_GUI || res != E_ABORT)
1209*f6dc9357SAndroid Build Coastguard Worker MessageBoxError_Status(HResultToMessage(res));
1210*f6dc9357SAndroid Build Coastguard Worker
1211*f6dc9357SAndroid Build Coastguard Worker if (ExitWasAsked_in_GUI)
1212*f6dc9357SAndroid Build Coastguard Worker {
1213*f6dc9357SAndroid Build Coastguard Worker // SetItemText(IDT_BENCH_ERROR_MESSAGE, "before CModalDialog::OnCancel()");
1214*f6dc9357SAndroid Build Coastguard Worker // Sleep (2000);
1215*f6dc9357SAndroid Build Coastguard Worker // MessageBoxError(L"test");
1216*f6dc9357SAndroid Build Coastguard Worker CModalDialog::OnCancel();
1217*f6dc9357SAndroid Build Coastguard Worker return true;
1218*f6dc9357SAndroid Build Coastguard Worker }
1219*f6dc9357SAndroid Build Coastguard Worker
1220*f6dc9357SAndroid Build Coastguard Worker SetItemText_Empty(IDT_BENCH_ERROR_MESSAGE);
1221*f6dc9357SAndroid Build Coastguard Worker
1222*f6dc9357SAndroid Build Coastguard Worker res = Sync.BenchFinish_Task_HRESULT;
1223*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
1224*f6dc9357SAndroid Build Coastguard Worker {
1225*f6dc9357SAndroid Build Coastguard Worker if (!WasStopped_in_GUI || res != E_ABORT)
1226*f6dc9357SAndroid Build Coastguard Worker {
1227*f6dc9357SAndroid Build Coastguard Worker UString m;
1228*f6dc9357SAndroid Build Coastguard Worker if (res == S_FALSE)
1229*f6dc9357SAndroid Build Coastguard Worker m = "Decoding error";
1230*f6dc9357SAndroid Build Coastguard Worker else if (res == CLASS_E_CLASSNOTAVAILABLE)
1231*f6dc9357SAndroid Build Coastguard Worker m = "Can't find 7z.dll";
1232*f6dc9357SAndroid Build Coastguard Worker else
1233*f6dc9357SAndroid Build Coastguard Worker m = HResultToMessage(res);
1234*f6dc9357SAndroid Build Coastguard Worker MessageBoxError_Status(m);
1235*f6dc9357SAndroid Build Coastguard Worker }
1236*f6dc9357SAndroid Build Coastguard Worker }
1237*f6dc9357SAndroid Build Coastguard Worker
1238*f6dc9357SAndroid Build Coastguard Worker if (NeedRestart)
1239*f6dc9357SAndroid Build Coastguard Worker {
1240*f6dc9357SAndroid Build Coastguard Worker StartBenchmark();
1241*f6dc9357SAndroid Build Coastguard Worker return true;
1242*f6dc9357SAndroid Build Coastguard Worker }
1243*f6dc9357SAndroid Build Coastguard Worker }
1244*f6dc9357SAndroid Build Coastguard Worker // k_Message_Finished_cnt++;
1245*f6dc9357SAndroid Build Coastguard Worker UpdateGui();
1246*f6dc9357SAndroid Build Coastguard Worker return true;
1247*f6dc9357SAndroid Build Coastguard Worker }
1248*f6dc9357SAndroid Build Coastguard Worker }
1249*f6dc9357SAndroid Build Coastguard Worker
1250*f6dc9357SAndroid Build Coastguard Worker
1251*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnTimer(WPARAM timerID, LPARAM /* callback */)
1252*f6dc9357SAndroid Build Coastguard Worker {
1253*f6dc9357SAndroid Build Coastguard Worker // k_OnTimer_cnt++;
1254*f6dc9357SAndroid Build Coastguard Worker if (timerID == kTimerID)
1255*f6dc9357SAndroid Build Coastguard Worker UpdateGui();
1256*f6dc9357SAndroid Build Coastguard Worker return true;
1257*f6dc9357SAndroid Build Coastguard Worker }
1258*f6dc9357SAndroid Build Coastguard Worker
1259*f6dc9357SAndroid Build Coastguard Worker
1260*f6dc9357SAndroid Build Coastguard Worker void CBenchmarkDialog::UpdateGui()
1261*f6dc9357SAndroid Build Coastguard Worker {
1262*f6dc9357SAndroid Build Coastguard Worker PrintTime();
1263*f6dc9357SAndroid Build Coastguard Worker
1264*f6dc9357SAndroid Build Coastguard Worker if (TotalMode)
1265*f6dc9357SAndroid Build Coastguard Worker {
1266*f6dc9357SAndroid Build Coastguard Worker bool wasChanged = false;
1267*f6dc9357SAndroid Build Coastguard Worker {
1268*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
1269*f6dc9357SAndroid Build Coastguard Worker
1270*f6dc9357SAndroid Build Coastguard Worker if (Sync.TextWasChanged)
1271*f6dc9357SAndroid Build Coastguard Worker {
1272*f6dc9357SAndroid Build Coastguard Worker wasChanged = true;
1273*f6dc9357SAndroid Build Coastguard Worker Bench2Text += Sync.Text;
1274*f6dc9357SAndroid Build Coastguard Worker Sync.Text.Empty();
1275*f6dc9357SAndroid Build Coastguard Worker Sync.TextWasChanged = false;
1276*f6dc9357SAndroid Build Coastguard Worker }
1277*f6dc9357SAndroid Build Coastguard Worker }
1278*f6dc9357SAndroid Build Coastguard Worker if (wasChanged)
1279*f6dc9357SAndroid Build Coastguard Worker _consoleEdit.SetText(Bench2Text);
1280*f6dc9357SAndroid Build Coastguard Worker return;
1281*f6dc9357SAndroid Build Coastguard Worker }
1282*f6dc9357SAndroid Build Coastguard Worker
1283*f6dc9357SAndroid Build Coastguard Worker CSyncData sd;
1284*f6dc9357SAndroid Build Coastguard Worker CRecordVector<CBenchPassResult> RatingVector;
1285*f6dc9357SAndroid Build Coastguard Worker
1286*f6dc9357SAndroid Build Coastguard Worker {
1287*f6dc9357SAndroid Build Coastguard Worker NWindows::NSynchronization::CCriticalSectionLock lock(Sync.CS);
1288*f6dc9357SAndroid Build Coastguard Worker sd = Sync.sd;
1289*f6dc9357SAndroid Build Coastguard Worker
1290*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_RatingVector)
1291*f6dc9357SAndroid Build Coastguard Worker RatingVector = Sync.RatingVector;
1292*f6dc9357SAndroid Build Coastguard Worker
1293*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_Freq)
1294*f6dc9357SAndroid Build Coastguard Worker {
1295*f6dc9357SAndroid Build Coastguard Worker Sync.FreqString_GUI = Sync.FreqString_Sync;
1296*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_RatingVector = true;
1297*f6dc9357SAndroid Build Coastguard Worker }
1298*f6dc9357SAndroid Build Coastguard Worker
1299*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_RatingVector = false;
1300*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Enc_1 = false;
1301*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Enc = false;
1302*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Dec_1 = false;
1303*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Dec = false;
1304*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Tot = false;
1305*f6dc9357SAndroid Build Coastguard Worker Sync.sd.NeedPrint_Freq = false;
1306*f6dc9357SAndroid Build Coastguard Worker }
1307*f6dc9357SAndroid Build Coastguard Worker
1308*f6dc9357SAndroid Build Coastguard Worker if (sd.NumPasses_Finished != NumPasses_Finished_Prev)
1309*f6dc9357SAndroid Build Coastguard Worker {
1310*f6dc9357SAndroid Build Coastguard Worker SetItemText_Number(IDT_BENCH_PASSES_VAL, sd.NumPasses_Finished, TEXT(" /"));
1311*f6dc9357SAndroid Build Coastguard Worker NumPasses_Finished_Prev = sd.NumPasses_Finished;
1312*f6dc9357SAndroid Build Coastguard Worker }
1313*f6dc9357SAndroid Build Coastguard Worker
1314*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_Enc_1) PrintBenchRes(sd.Enc_BenchRes_1, k_Ids_Enc_1);
1315*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_Enc) PrintBenchRes(sd.Enc_BenchRes, k_Ids_Enc);
1316*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_Dec_1) PrintBenchRes(sd.Dec_BenchRes_1, k_Ids_Dec_1);
1317*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_Dec) PrintBenchRes(sd.Dec_BenchRes, k_Ids_Dec);
1318*f6dc9357SAndroid Build Coastguard Worker
1319*f6dc9357SAndroid Build Coastguard Worker if (sd.BenchWasFinished && sd.NeedPrint_Tot)
1320*f6dc9357SAndroid Build Coastguard Worker {
1321*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 tot_BenchRes = sd.Enc_BenchRes;
1322*f6dc9357SAndroid Build Coastguard Worker tot_BenchRes.Update_With_Res2(sd.Dec_BenchRes);
1323*f6dc9357SAndroid Build Coastguard Worker PrintBenchRes(tot_BenchRes, k_Ids_Tot);
1324*f6dc9357SAndroid Build Coastguard Worker }
1325*f6dc9357SAndroid Build Coastguard Worker
1326*f6dc9357SAndroid Build Coastguard Worker
1327*f6dc9357SAndroid Build Coastguard Worker if (sd.NeedPrint_RatingVector)
1328*f6dc9357SAndroid Build Coastguard Worker // for (unsigned k = 0; k < 1; k++)
1329*f6dc9357SAndroid Build Coastguard Worker {
1330*f6dc9357SAndroid Build Coastguard Worker UString s;
1331*f6dc9357SAndroid Build Coastguard Worker s += Sync.FreqString_GUI;
1332*f6dc9357SAndroid Build Coastguard Worker if (!RatingVector.IsEmpty())
1333*f6dc9357SAndroid Build Coastguard Worker {
1334*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
1335*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1336*f6dc9357SAndroid Build Coastguard Worker s += "Compr Decompr Total CPU"
1337*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1338*f6dc9357SAndroid Build Coastguard Worker " Time"
1339*f6dc9357SAndroid Build Coastguard Worker #endif
1340*f6dc9357SAndroid Build Coastguard Worker ;
1341*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1342*f6dc9357SAndroid Build Coastguard Worker }
1343*f6dc9357SAndroid Build Coastguard Worker // s += "GIPS GIPS GIPS % s"; s.Add_LF();
1344*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < RatingVector.Size(); i++)
1345*f6dc9357SAndroid Build Coastguard Worker {
1346*f6dc9357SAndroid Build Coastguard Worker if (i != 0)
1347*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1348*f6dc9357SAndroid Build Coastguard Worker if ((int)i == sd.RatingVector_DeletedIndex)
1349*f6dc9357SAndroid Build Coastguard Worker {
1350*f6dc9357SAndroid Build Coastguard Worker s += "...";
1351*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1352*f6dc9357SAndroid Build Coastguard Worker }
1353*f6dc9357SAndroid Build Coastguard Worker const CBenchPassResult &pair = RatingVector[i];
1354*f6dc9357SAndroid Build Coastguard Worker /*
1355*f6dc9357SAndroid Build Coastguard Worker s += "g:"; s.Add_UInt32((UInt32)pair.EncInfo.GlobalTime);
1356*f6dc9357SAndroid Build Coastguard Worker s += " u:"; s.Add_UInt32((UInt32)pair.EncInfo.UserTime);
1357*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1358*f6dc9357SAndroid Build Coastguard Worker */
1359*f6dc9357SAndroid Build Coastguard Worker AddRatingsLine(s, pair.Enc, pair.Dec
1360*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1361*f6dc9357SAndroid Build Coastguard Worker , pair.Ticks
1362*f6dc9357SAndroid Build Coastguard Worker #endif
1363*f6dc9357SAndroid Build Coastguard Worker );
1364*f6dc9357SAndroid Build Coastguard Worker /*
1365*f6dc9357SAndroid Build Coastguard Worker {
1366*f6dc9357SAndroid Build Coastguard Worker UInt64 v = i + 1;
1367*f6dc9357SAndroid Build Coastguard Worker if (sd.RatingVector_DeletedIndex >= 0 && i >= (unsigned)sd.RatingVector_DeletedIndex)
1368*f6dc9357SAndroid Build Coastguard Worker v += sd.RatingVector_NumDeleted;
1369*f6dc9357SAndroid Build Coastguard Worker char temp[64];
1370*f6dc9357SAndroid Build Coastguard Worker ConvertUInt64ToString(v, temp);
1371*f6dc9357SAndroid Build Coastguard Worker s += " : ";
1372*f6dc9357SAndroid Build Coastguard Worker s += temp;
1373*f6dc9357SAndroid Build Coastguard Worker }
1374*f6dc9357SAndroid Build Coastguard Worker */
1375*f6dc9357SAndroid Build Coastguard Worker }
1376*f6dc9357SAndroid Build Coastguard Worker
1377*f6dc9357SAndroid Build Coastguard Worker if (sd.BenchWasFinished)
1378*f6dc9357SAndroid Build Coastguard Worker {
1379*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1380*f6dc9357SAndroid Build Coastguard Worker s += "-------------";
1381*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1382*f6dc9357SAndroid Build Coastguard Worker {
1383*f6dc9357SAndroid Build Coastguard Worker // average time is not correct because of freq detection in first iteration
1384*f6dc9357SAndroid Build Coastguard Worker AddRatingsLine(s, sd.Enc_BenchRes, sd.Dec_BenchRes
1385*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1386*f6dc9357SAndroid Build Coastguard Worker , (DWORD)(sd.TotalTicks / (sd.NumPasses_Finished ? sd.NumPasses_Finished : 1))
1387*f6dc9357SAndroid Build Coastguard Worker #endif
1388*f6dc9357SAndroid Build Coastguard Worker );
1389*f6dc9357SAndroid Build Coastguard Worker }
1390*f6dc9357SAndroid Build Coastguard Worker }
1391*f6dc9357SAndroid Build Coastguard Worker // s.Add_LF(); s += "OnTimer: "; s.Add_UInt32(k_OnTimer_cnt);
1392*f6dc9357SAndroid Build Coastguard Worker // s.Add_LF(); s += "finished Message: "; s.Add_UInt32(k_Message_Finished_cnt);
1393*f6dc9357SAndroid Build Coastguard Worker // static cnt = 0; cnt++; s.Add_LF(); s += "Print: "; s.Add_UInt32(cnt);
1394*f6dc9357SAndroid Build Coastguard Worker // s.Add_LF(); s += "NumEncProgress: "; s.Add_UInt32((UInt32)sd.NumEncProgress);
1395*f6dc9357SAndroid Build Coastguard Worker // s.Add_LF(); s += "NumDecProgress: "; s.Add_UInt32((UInt32)sd.NumDecProgress);
1396*f6dc9357SAndroid Build Coastguard Worker SetItemText(IDT_BENCH_LOG, s);
1397*f6dc9357SAndroid Build Coastguard Worker }
1398*f6dc9357SAndroid Build Coastguard Worker }
1399*f6dc9357SAndroid Build Coastguard Worker
1400*f6dc9357SAndroid Build Coastguard Worker
1401*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
1402*f6dc9357SAndroid Build Coastguard Worker {
1403*f6dc9357SAndroid Build Coastguard Worker if (code == CBN_SELCHANGE &&
1404*f6dc9357SAndroid Build Coastguard Worker (itemID == IDC_BENCH_DICTIONARY ||
1405*f6dc9357SAndroid Build Coastguard Worker itemID == IDC_BENCH_NUM_PASSES ||
1406*f6dc9357SAndroid Build Coastguard Worker itemID == IDC_BENCH_NUM_THREADS))
1407*f6dc9357SAndroid Build Coastguard Worker {
1408*f6dc9357SAndroid Build Coastguard Worker RestartBenchmark();
1409*f6dc9357SAndroid Build Coastguard Worker return true;
1410*f6dc9357SAndroid Build Coastguard Worker }
1411*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnCommand(code, itemID, lParam);
1412*f6dc9357SAndroid Build Coastguard Worker }
1413*f6dc9357SAndroid Build Coastguard Worker
1414*f6dc9357SAndroid Build Coastguard Worker
1415*f6dc9357SAndroid Build Coastguard Worker bool CBenchmarkDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
1416*f6dc9357SAndroid Build Coastguard Worker {
1417*f6dc9357SAndroid Build Coastguard Worker switch (buttonID)
1418*f6dc9357SAndroid Build Coastguard Worker {
1419*f6dc9357SAndroid Build Coastguard Worker case IDB_RESTART:
1420*f6dc9357SAndroid Build Coastguard Worker RestartBenchmark();
1421*f6dc9357SAndroid Build Coastguard Worker return true;
1422*f6dc9357SAndroid Build Coastguard Worker case IDB_STOP:
1423*f6dc9357SAndroid Build Coastguard Worker OnStopButton();
1424*f6dc9357SAndroid Build Coastguard Worker return true;
1425*f6dc9357SAndroid Build Coastguard Worker }
1426*f6dc9357SAndroid Build Coastguard Worker return CModalDialog::OnButtonClicked(buttonID, buttonHWND);
1427*f6dc9357SAndroid Build Coastguard Worker }
1428*f6dc9357SAndroid Build Coastguard Worker
1429*f6dc9357SAndroid Build Coastguard Worker
1430*f6dc9357SAndroid Build Coastguard Worker
1431*f6dc9357SAndroid Build Coastguard Worker
1432*f6dc9357SAndroid Build Coastguard Worker
1433*f6dc9357SAndroid Build Coastguard Worker // ---------- Benchmark Thread ----------
1434*f6dc9357SAndroid Build Coastguard Worker
1435*f6dc9357SAndroid Build Coastguard Worker struct CBenchCallback Z7_final: public IBenchCallback
1436*f6dc9357SAndroid Build Coastguard Worker {
1437*f6dc9357SAndroid Build Coastguard Worker UInt64 dictionarySize;
1438*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync *Sync;
1439*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog *BenchmarkDialog;
1440*f6dc9357SAndroid Build Coastguard Worker
1441*f6dc9357SAndroid Build Coastguard Worker HRESULT SetEncodeResult(const CBenchInfo &info, bool final) Z7_override;
1442*f6dc9357SAndroid Build Coastguard Worker HRESULT SetDecodeResult(const CBenchInfo &info, bool final) Z7_override;
1443*f6dc9357SAndroid Build Coastguard Worker };
1444*f6dc9357SAndroid Build Coastguard Worker
1445*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback::SetEncodeResult(const CBenchInfo &info, bool final)
1446*f6dc9357SAndroid Build Coastguard Worker {
1447*f6dc9357SAndroid Build Coastguard Worker bool needPost = false;
1448*f6dc9357SAndroid Build Coastguard Worker {
1449*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(Sync->CS);
1450*f6dc9357SAndroid Build Coastguard Worker if (Sync->Exit)
1451*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
1452*f6dc9357SAndroid Build Coastguard Worker CSyncData &sd = Sync->sd;
1453*f6dc9357SAndroid Build Coastguard Worker // sd.NumEncProgress++;
1454*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 &br = sd.Enc_BenchRes_1;
1455*f6dc9357SAndroid Build Coastguard Worker {
1456*f6dc9357SAndroid Build Coastguard Worker UInt64 dictSize = Sync->DictSize;
1457*f6dc9357SAndroid Build Coastguard Worker if (final)
1458*f6dc9357SAndroid Build Coastguard Worker {
1459*f6dc9357SAndroid Build Coastguard Worker // sd.EncInfo = info;
1460*f6dc9357SAndroid Build Coastguard Worker }
1461*f6dc9357SAndroid Build Coastguard Worker else
1462*f6dc9357SAndroid Build Coastguard Worker {
1463*f6dc9357SAndroid Build Coastguard Worker /* if (!final), then CBenchInfo::NumIterations means totalNumber of threads.
1464*f6dc9357SAndroid Build Coastguard Worker so we can reduce the dictionary */
1465*f6dc9357SAndroid Build Coastguard Worker if (dictSize > info.UnpackSize)
1466*f6dc9357SAndroid Build Coastguard Worker dictSize = info.UnpackSize;
1467*f6dc9357SAndroid Build Coastguard Worker }
1468*f6dc9357SAndroid Build Coastguard Worker br.Rating = info.GetRating_LzmaEnc(dictSize);
1469*f6dc9357SAndroid Build Coastguard Worker }
1470*f6dc9357SAndroid Build Coastguard Worker br.SetFrom_BenchInfo(info);
1471*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_Enc_1 = true;
1472*f6dc9357SAndroid Build Coastguard Worker if (final)
1473*f6dc9357SAndroid Build Coastguard Worker {
1474*f6dc9357SAndroid Build Coastguard Worker sd.Enc_BenchRes.Update_With_Res2(br);
1475*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_Enc = true;
1476*f6dc9357SAndroid Build Coastguard Worker needPost = true;
1477*f6dc9357SAndroid Build Coastguard Worker }
1478*f6dc9357SAndroid Build Coastguard Worker }
1479*f6dc9357SAndroid Build Coastguard Worker
1480*f6dc9357SAndroid Build Coastguard Worker if (needPost)
1481*f6dc9357SAndroid Build Coastguard Worker BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1482*f6dc9357SAndroid Build Coastguard Worker
1483*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1484*f6dc9357SAndroid Build Coastguard Worker }
1485*f6dc9357SAndroid Build Coastguard Worker
1486*f6dc9357SAndroid Build Coastguard Worker
1487*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback::SetDecodeResult(const CBenchInfo &info, bool final)
1488*f6dc9357SAndroid Build Coastguard Worker {
1489*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(Sync->CS);
1490*f6dc9357SAndroid Build Coastguard Worker if (Sync->Exit)
1491*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
1492*f6dc9357SAndroid Build Coastguard Worker CSyncData &sd = Sync->sd;
1493*f6dc9357SAndroid Build Coastguard Worker // sd.NumDecProgress++;
1494*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes2 &br = sd.Dec_BenchRes_1;
1495*f6dc9357SAndroid Build Coastguard Worker br.Rating = info.GetRating_LzmaDec();
1496*f6dc9357SAndroid Build Coastguard Worker br.SetFrom_BenchInfo(info);
1497*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_Dec_1 = true;
1498*f6dc9357SAndroid Build Coastguard Worker if (final)
1499*f6dc9357SAndroid Build Coastguard Worker sd.Dec_BenchRes.Update_With_Res2(br);
1500*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1501*f6dc9357SAndroid Build Coastguard Worker }
1502*f6dc9357SAndroid Build Coastguard Worker
1503*f6dc9357SAndroid Build Coastguard Worker
1504*f6dc9357SAndroid Build Coastguard Worker struct CBenchCallback2 Z7_final: public IBenchPrintCallback
1505*f6dc9357SAndroid Build Coastguard Worker {
1506*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync *Sync;
1507*f6dc9357SAndroid Build Coastguard Worker bool TotalMode;
1508*f6dc9357SAndroid Build Coastguard Worker
1509*f6dc9357SAndroid Build Coastguard Worker void Print(const char *s) Z7_override;
1510*f6dc9357SAndroid Build Coastguard Worker void NewLine() Z7_override;
1511*f6dc9357SAndroid Build Coastguard Worker HRESULT CheckBreak() Z7_override;
1512*f6dc9357SAndroid Build Coastguard Worker };
1513*f6dc9357SAndroid Build Coastguard Worker
1514*f6dc9357SAndroid Build Coastguard Worker void CBenchCallback2::Print(const char *s)
1515*f6dc9357SAndroid Build Coastguard Worker {
1516*f6dc9357SAndroid Build Coastguard Worker if (TotalMode)
1517*f6dc9357SAndroid Build Coastguard Worker {
1518*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(Sync->CS);
1519*f6dc9357SAndroid Build Coastguard Worker Sync->Text += s;
1520*f6dc9357SAndroid Build Coastguard Worker Sync->TextWasChanged = true;
1521*f6dc9357SAndroid Build Coastguard Worker }
1522*f6dc9357SAndroid Build Coastguard Worker }
1523*f6dc9357SAndroid Build Coastguard Worker
1524*f6dc9357SAndroid Build Coastguard Worker void CBenchCallback2::NewLine()
1525*f6dc9357SAndroid Build Coastguard Worker {
1526*f6dc9357SAndroid Build Coastguard Worker Print("\xD\n");
1527*f6dc9357SAndroid Build Coastguard Worker }
1528*f6dc9357SAndroid Build Coastguard Worker
1529*f6dc9357SAndroid Build Coastguard Worker HRESULT CBenchCallback2::CheckBreak()
1530*f6dc9357SAndroid Build Coastguard Worker {
1531*f6dc9357SAndroid Build Coastguard Worker if (Sync->Exit)
1532*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
1533*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1534*f6dc9357SAndroid Build Coastguard Worker }
1535*f6dc9357SAndroid Build Coastguard Worker
1536*f6dc9357SAndroid Build Coastguard Worker
1537*f6dc9357SAndroid Build Coastguard Worker
1538*f6dc9357SAndroid Build Coastguard Worker struct CFreqCallback Z7_final: public IBenchFreqCallback
1539*f6dc9357SAndroid Build Coastguard Worker {
1540*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog *BenchmarkDialog;
1541*f6dc9357SAndroid Build Coastguard Worker
1542*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT AddCpuFreq(unsigned numThreads, UInt64 freq, UInt64 usage) Z7_override;
1543*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT FreqsFinished(unsigned numThreads) Z7_override;
1544*f6dc9357SAndroid Build Coastguard Worker };
1545*f6dc9357SAndroid Build Coastguard Worker
1546*f6dc9357SAndroid Build Coastguard Worker HRESULT CFreqCallback::AddCpuFreq(unsigned numThreads, UInt64 freq, UInt64 usage)
1547*f6dc9357SAndroid Build Coastguard Worker {
1548*f6dc9357SAndroid Build Coastguard Worker HRESULT res;
1549*f6dc9357SAndroid Build Coastguard Worker {
1550*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync &sync = BenchmarkDialog->Sync;
1551*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(sync.CS);
1552*f6dc9357SAndroid Build Coastguard Worker UString &s = sync.FreqString_Sync;
1553*f6dc9357SAndroid Build Coastguard Worker if (sync.NumFreqThreadsPrev != numThreads)
1554*f6dc9357SAndroid Build Coastguard Worker {
1555*f6dc9357SAndroid Build Coastguard Worker sync.NumFreqThreadsPrev = numThreads;
1556*f6dc9357SAndroid Build Coastguard Worker if (!s.IsEmpty())
1557*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1558*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt32(numThreads);
1559*f6dc9357SAndroid Build Coastguard Worker s += "T Frequency (MHz):";
1560*f6dc9357SAndroid Build Coastguard Worker s.Add_LF();
1561*f6dc9357SAndroid Build Coastguard Worker }
1562*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1563*f6dc9357SAndroid Build Coastguard Worker if (numThreads != 1)
1564*f6dc9357SAndroid Build Coastguard Worker {
1565*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(GetUsagePercents(usage));
1566*f6dc9357SAndroid Build Coastguard Worker s.Add_Char('%');
1567*f6dc9357SAndroid Build Coastguard Worker s.Add_Space();
1568*f6dc9357SAndroid Build Coastguard Worker }
1569*f6dc9357SAndroid Build Coastguard Worker s.Add_UInt64(GetMips(freq));
1570*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog->Sync.sd.NeedPrint_Freq = true;
1571*f6dc9357SAndroid Build Coastguard Worker res = sync.Exit ? E_ABORT : S_OK;
1572*f6dc9357SAndroid Build Coastguard Worker }
1573*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1574*f6dc9357SAndroid Build Coastguard Worker return res;
1575*f6dc9357SAndroid Build Coastguard Worker }
1576*f6dc9357SAndroid Build Coastguard Worker
1577*f6dc9357SAndroid Build Coastguard Worker HRESULT CFreqCallback::FreqsFinished(unsigned /* numThreads */)
1578*f6dc9357SAndroid Build Coastguard Worker {
1579*f6dc9357SAndroid Build Coastguard Worker HRESULT res;
1580*f6dc9357SAndroid Build Coastguard Worker {
1581*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync &sync = BenchmarkDialog->Sync;
1582*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(sync.CS);
1583*f6dc9357SAndroid Build Coastguard Worker sync.sd.NeedPrint_Freq = true;
1584*f6dc9357SAndroid Build Coastguard Worker BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1585*f6dc9357SAndroid Build Coastguard Worker res = sync.Exit ? E_ABORT : S_OK;
1586*f6dc9357SAndroid Build Coastguard Worker }
1587*f6dc9357SAndroid Build Coastguard Worker BenchmarkDialog->PostMsg(k_Message_Finished, k_Msg_WPARM_Enc1_Finished);
1588*f6dc9357SAndroid Build Coastguard Worker return res;
1589*f6dc9357SAndroid Build Coastguard Worker }
1590*f6dc9357SAndroid Build Coastguard Worker
1591*f6dc9357SAndroid Build Coastguard Worker
1592*f6dc9357SAndroid Build Coastguard Worker
1593*f6dc9357SAndroid Build Coastguard Worker // define USE_DUMMY only for debug
1594*f6dc9357SAndroid Build Coastguard Worker // #define USE_DUMMY
1595*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_DUMMY
1596*f6dc9357SAndroid Build Coastguard Worker static unsigned dummy = 1;
1597*f6dc9357SAndroid Build Coastguard Worker static unsigned Dummy(unsigned limit)
1598*f6dc9357SAndroid Build Coastguard Worker {
1599*f6dc9357SAndroid Build Coastguard Worker unsigned sum = 0;
1600*f6dc9357SAndroid Build Coastguard Worker for (unsigned k = 0; k < limit; k++)
1601*f6dc9357SAndroid Build Coastguard Worker {
1602*f6dc9357SAndroid Build Coastguard Worker sum += dummy;
1603*f6dc9357SAndroid Build Coastguard Worker if (sum == 0)
1604*f6dc9357SAndroid Build Coastguard Worker break;
1605*f6dc9357SAndroid Build Coastguard Worker }
1606*f6dc9357SAndroid Build Coastguard Worker return sum;
1607*f6dc9357SAndroid Build Coastguard Worker }
1608*f6dc9357SAndroid Build Coastguard Worker #endif
1609*f6dc9357SAndroid Build Coastguard Worker
1610*f6dc9357SAndroid Build Coastguard Worker
1611*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadBenchmark::Process()
1612*f6dc9357SAndroid Build Coastguard Worker {
1613*f6dc9357SAndroid Build Coastguard Worker /* the first benchmark pass can be slow,
1614*f6dc9357SAndroid Build Coastguard Worker if we run benchmark while the window is being created,
1615*f6dc9357SAndroid Build Coastguard Worker and (no freq detecion loop) && (dictionary is small) (-mtic is small) */
1616*f6dc9357SAndroid Build Coastguard Worker
1617*f6dc9357SAndroid Build Coastguard Worker // Sleep(300); // for debug
1618*f6dc9357SAndroid Build Coastguard Worker #ifdef USE_DUMMY
1619*f6dc9357SAndroid Build Coastguard Worker Dummy(1000 * 1000 * 1000); // for debug
1620*f6dc9357SAndroid Build Coastguard Worker #endif
1621*f6dc9357SAndroid Build Coastguard Worker
1622*f6dc9357SAndroid Build Coastguard Worker CBenchProgressSync &sync = BenchmarkDialog->Sync;
1623*f6dc9357SAndroid Build Coastguard Worker HRESULT finishHRESULT = S_OK;
1624*f6dc9357SAndroid Build Coastguard Worker
1625*f6dc9357SAndroid Build Coastguard Worker try
1626*f6dc9357SAndroid Build Coastguard Worker {
1627*f6dc9357SAndroid Build Coastguard Worker for (UInt32 passIndex = 0;; passIndex++)
1628*f6dc9357SAndroid Build Coastguard Worker {
1629*f6dc9357SAndroid Build Coastguard Worker // throw 1; // to debug
1630*f6dc9357SAndroid Build Coastguard Worker // throw CSystemException(E_INVALIDARG); // to debug
1631*f6dc9357SAndroid Build Coastguard Worker
1632*f6dc9357SAndroid Build Coastguard Worker UInt64 dictionarySize;
1633*f6dc9357SAndroid Build Coastguard Worker UInt32 numThreads;
1634*f6dc9357SAndroid Build Coastguard Worker {
1635*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(sync.CS);
1636*f6dc9357SAndroid Build Coastguard Worker if (sync.Exit)
1637*f6dc9357SAndroid Build Coastguard Worker break;
1638*f6dc9357SAndroid Build Coastguard Worker dictionarySize = sync.DictSize;
1639*f6dc9357SAndroid Build Coastguard Worker numThreads = sync.NumThreads;
1640*f6dc9357SAndroid Build Coastguard Worker }
1641*f6dc9357SAndroid Build Coastguard Worker
1642*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1643*f6dc9357SAndroid Build Coastguard Worker const DWORD startTick = GetTickCount();
1644*f6dc9357SAndroid Build Coastguard Worker #endif
1645*f6dc9357SAndroid Build Coastguard Worker
1646*f6dc9357SAndroid Build Coastguard Worker CBenchCallback callback;
1647*f6dc9357SAndroid Build Coastguard Worker
1648*f6dc9357SAndroid Build Coastguard Worker callback.dictionarySize = dictionarySize;
1649*f6dc9357SAndroid Build Coastguard Worker callback.Sync = &sync;
1650*f6dc9357SAndroid Build Coastguard Worker callback.BenchmarkDialog = BenchmarkDialog;
1651*f6dc9357SAndroid Build Coastguard Worker
1652*f6dc9357SAndroid Build Coastguard Worker CBenchCallback2 callback2;
1653*f6dc9357SAndroid Build Coastguard Worker callback2.TotalMode = BenchmarkDialog->TotalMode;
1654*f6dc9357SAndroid Build Coastguard Worker callback2.Sync = &sync;
1655*f6dc9357SAndroid Build Coastguard Worker
1656*f6dc9357SAndroid Build Coastguard Worker CFreqCallback freqCallback;
1657*f6dc9357SAndroid Build Coastguard Worker freqCallback.BenchmarkDialog = BenchmarkDialog;
1658*f6dc9357SAndroid Build Coastguard Worker
1659*f6dc9357SAndroid Build Coastguard Worker HRESULT result;
1660*f6dc9357SAndroid Build Coastguard Worker
1661*f6dc9357SAndroid Build Coastguard Worker try
1662*f6dc9357SAndroid Build Coastguard Worker {
1663*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CProperty> props;
1664*f6dc9357SAndroid Build Coastguard Worker
1665*f6dc9357SAndroid Build Coastguard Worker props = BenchmarkDialog->Props;
1666*f6dc9357SAndroid Build Coastguard Worker
1667*f6dc9357SAndroid Build Coastguard Worker if (BenchmarkDialog->TotalMode)
1668*f6dc9357SAndroid Build Coastguard Worker {
1669*f6dc9357SAndroid Build Coastguard Worker props = BenchmarkDialog->Props;
1670*f6dc9357SAndroid Build Coastguard Worker }
1671*f6dc9357SAndroid Build Coastguard Worker else
1672*f6dc9357SAndroid Build Coastguard Worker {
1673*f6dc9357SAndroid Build Coastguard Worker {
1674*f6dc9357SAndroid Build Coastguard Worker CProperty prop;
1675*f6dc9357SAndroid Build Coastguard Worker prop.Name = "mt";
1676*f6dc9357SAndroid Build Coastguard Worker prop.Value.Add_UInt32(numThreads);
1677*f6dc9357SAndroid Build Coastguard Worker props.Add(prop);
1678*f6dc9357SAndroid Build Coastguard Worker }
1679*f6dc9357SAndroid Build Coastguard Worker {
1680*f6dc9357SAndroid Build Coastguard Worker CProperty prop;
1681*f6dc9357SAndroid Build Coastguard Worker prop.Name = 'd';
1682*f6dc9357SAndroid Build Coastguard Worker prop.Name.Add_UInt32((UInt32)(dictionarySize >> 10));
1683*f6dc9357SAndroid Build Coastguard Worker prop.Name.Add_Char('k');
1684*f6dc9357SAndroid Build Coastguard Worker props.Add(prop);
1685*f6dc9357SAndroid Build Coastguard Worker }
1686*f6dc9357SAndroid Build Coastguard Worker }
1687*f6dc9357SAndroid Build Coastguard Worker
1688*f6dc9357SAndroid Build Coastguard Worker result = Bench(EXTERNAL_CODECS_LOC_VARS
1689*f6dc9357SAndroid Build Coastguard Worker BenchmarkDialog->TotalMode ? &callback2 : NULL,
1690*f6dc9357SAndroid Build Coastguard Worker BenchmarkDialog->TotalMode ? NULL : &callback,
1691*f6dc9357SAndroid Build Coastguard Worker props, 1, false,
1692*f6dc9357SAndroid Build Coastguard Worker (!BenchmarkDialog->TotalMode) && passIndex == 0 ? &freqCallback: NULL);
1693*f6dc9357SAndroid Build Coastguard Worker
1694*f6dc9357SAndroid Build Coastguard Worker // result = S_FALSE; // for debug;
1695*f6dc9357SAndroid Build Coastguard Worker // throw 1;
1696*f6dc9357SAndroid Build Coastguard Worker }
1697*f6dc9357SAndroid Build Coastguard Worker catch(...)
1698*f6dc9357SAndroid Build Coastguard Worker {
1699*f6dc9357SAndroid Build Coastguard Worker result = E_FAIL;
1700*f6dc9357SAndroid Build Coastguard Worker }
1701*f6dc9357SAndroid Build Coastguard Worker
1702*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1703*f6dc9357SAndroid Build Coastguard Worker const DWORD numTicks = GetTickCount() - startTick;
1704*f6dc9357SAndroid Build Coastguard Worker #endif
1705*f6dc9357SAndroid Build Coastguard Worker
1706*f6dc9357SAndroid Build Coastguard Worker bool finished = true;
1707*f6dc9357SAndroid Build Coastguard Worker
1708*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(sync.CS);
1709*f6dc9357SAndroid Build Coastguard Worker
1710*f6dc9357SAndroid Build Coastguard Worker if (result != S_OK)
1711*f6dc9357SAndroid Build Coastguard Worker {
1712*f6dc9357SAndroid Build Coastguard Worker sync.BenchFinish_Task_HRESULT = result;
1713*f6dc9357SAndroid Build Coastguard Worker break;
1714*f6dc9357SAndroid Build Coastguard Worker }
1715*f6dc9357SAndroid Build Coastguard Worker
1716*f6dc9357SAndroid Build Coastguard Worker {
1717*f6dc9357SAndroid Build Coastguard Worker CSyncData &sd = sync.sd;
1718*f6dc9357SAndroid Build Coastguard Worker
1719*f6dc9357SAndroid Build Coastguard Worker sd.NumPasses_Finished++;
1720*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1721*f6dc9357SAndroid Build Coastguard Worker sd.TotalTicks += numTicks;
1722*f6dc9357SAndroid Build Coastguard Worker #endif
1723*f6dc9357SAndroid Build Coastguard Worker
1724*f6dc9357SAndroid Build Coastguard Worker if (BenchmarkDialog->TotalMode)
1725*f6dc9357SAndroid Build Coastguard Worker break;
1726*f6dc9357SAndroid Build Coastguard Worker
1727*f6dc9357SAndroid Build Coastguard Worker {
1728*f6dc9357SAndroid Build Coastguard Worker CTotalBenchRes tot_BenchRes = sd.Enc_BenchRes_1;
1729*f6dc9357SAndroid Build Coastguard Worker tot_BenchRes.Update_With_Res(sd.Dec_BenchRes_1);
1730*f6dc9357SAndroid Build Coastguard Worker
1731*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_RatingVector = true;
1732*f6dc9357SAndroid Build Coastguard Worker {
1733*f6dc9357SAndroid Build Coastguard Worker CBenchPassResult pair;
1734*f6dc9357SAndroid Build Coastguard Worker // pair.EncInfo = sd.EncInfo; // for debug
1735*f6dc9357SAndroid Build Coastguard Worker pair.Enc = sd.Enc_BenchRes_1;
1736*f6dc9357SAndroid Build Coastguard Worker pair.Dec = sd.Dec_BenchRes_1;
1737*f6dc9357SAndroid Build Coastguard Worker #ifdef PRINT_ITER_TIME
1738*f6dc9357SAndroid Build Coastguard Worker pair.Ticks = numTicks;
1739*f6dc9357SAndroid Build Coastguard Worker #endif
1740*f6dc9357SAndroid Build Coastguard Worker sync.RatingVector.Add(pair);
1741*f6dc9357SAndroid Build Coastguard Worker // pair.Dec_Defined = true;
1742*f6dc9357SAndroid Build Coastguard Worker }
1743*f6dc9357SAndroid Build Coastguard Worker }
1744*f6dc9357SAndroid Build Coastguard Worker
1745*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_Dec = true;
1746*f6dc9357SAndroid Build Coastguard Worker sd.NeedPrint_Tot = true;
1747*f6dc9357SAndroid Build Coastguard Worker
1748*f6dc9357SAndroid Build Coastguard Worker if (sync.RatingVector.Size() > kRatingVector_NumBundlesMax)
1749*f6dc9357SAndroid Build Coastguard Worker {
1750*f6dc9357SAndroid Build Coastguard Worker // sd.RatingVector_NumDeleted++;
1751*f6dc9357SAndroid Build Coastguard Worker sd.RatingVector_DeletedIndex = (int)(kRatingVector_NumBundlesMax / 4);
1752*f6dc9357SAndroid Build Coastguard Worker sync.RatingVector.Delete((unsigned)(sd.RatingVector_DeletedIndex));
1753*f6dc9357SAndroid Build Coastguard Worker }
1754*f6dc9357SAndroid Build Coastguard Worker
1755*f6dc9357SAndroid Build Coastguard Worker if (sync.sd.NumPasses_Finished < sync.NumPasses_Limit)
1756*f6dc9357SAndroid Build Coastguard Worker finished = false;
1757*f6dc9357SAndroid Build Coastguard Worker else
1758*f6dc9357SAndroid Build Coastguard Worker {
1759*f6dc9357SAndroid Build Coastguard Worker sync.sd.BenchWasFinished = true;
1760*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog->_finishTime = GetTickCount();
1761*f6dc9357SAndroid Build Coastguard Worker // return 0;
1762*f6dc9357SAndroid Build Coastguard Worker }
1763*f6dc9357SAndroid Build Coastguard Worker }
1764*f6dc9357SAndroid Build Coastguard Worker
1765*f6dc9357SAndroid Build Coastguard Worker if (BenchmarkDialog->TotalMode)
1766*f6dc9357SAndroid Build Coastguard Worker break;
1767*f6dc9357SAndroid Build Coastguard Worker
1768*f6dc9357SAndroid Build Coastguard Worker /*
1769*f6dc9357SAndroid Build Coastguard Worker if (newTick - prevTick < 1000)
1770*f6dc9357SAndroid Build Coastguard Worker numSameTick++;
1771*f6dc9357SAndroid Build Coastguard Worker if (numSameTick > 5 || finished)
1772*f6dc9357SAndroid Build Coastguard Worker {
1773*f6dc9357SAndroid Build Coastguard Worker prevTick = newTick;
1774*f6dc9357SAndroid Build Coastguard Worker numSameTick = 0;
1775*f6dc9357SAndroid Build Coastguard Worker */
1776*f6dc9357SAndroid Build Coastguard Worker // for (unsigned i = 0; i < 1; i++)
1777*f6dc9357SAndroid Build Coastguard Worker {
1778*f6dc9357SAndroid Build Coastguard Worker // we suppose that PostMsg messages will be processed in order.
1779*f6dc9357SAndroid Build Coastguard Worker if (!BenchmarkDialog->PostMsg_Finish(k_Msg_WPARM_Iter_Finished))
1780*f6dc9357SAndroid Build Coastguard Worker {
1781*f6dc9357SAndroid Build Coastguard Worker finished = true;
1782*f6dc9357SAndroid Build Coastguard Worker finishHRESULT = E_FAIL;
1783*f6dc9357SAndroid Build Coastguard Worker // throw 1234567;
1784*f6dc9357SAndroid Build Coastguard Worker }
1785*f6dc9357SAndroid Build Coastguard Worker }
1786*f6dc9357SAndroid Build Coastguard Worker if (finished)
1787*f6dc9357SAndroid Build Coastguard Worker break;
1788*f6dc9357SAndroid Build Coastguard Worker }
1789*f6dc9357SAndroid Build Coastguard Worker // return S_OK;
1790*f6dc9357SAndroid Build Coastguard Worker }
1791*f6dc9357SAndroid Build Coastguard Worker catch(CSystemException &e)
1792*f6dc9357SAndroid Build Coastguard Worker {
1793*f6dc9357SAndroid Build Coastguard Worker finishHRESULT = e.ErrorCode;
1794*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog->MessageBoxError(HResultToMessage(e.ErrorCode));
1795*f6dc9357SAndroid Build Coastguard Worker // return E_FAIL;
1796*f6dc9357SAndroid Build Coastguard Worker }
1797*f6dc9357SAndroid Build Coastguard Worker catch(...)
1798*f6dc9357SAndroid Build Coastguard Worker {
1799*f6dc9357SAndroid Build Coastguard Worker finishHRESULT = E_FAIL;
1800*f6dc9357SAndroid Build Coastguard Worker // BenchmarkDialog->MessageBoxError(HResultToMessage(E_FAIL));
1801*f6dc9357SAndroid Build Coastguard Worker // return E_FAIL;
1802*f6dc9357SAndroid Build Coastguard Worker }
1803*f6dc9357SAndroid Build Coastguard Worker
1804*f6dc9357SAndroid Build Coastguard Worker if (finishHRESULT != S_OK)
1805*f6dc9357SAndroid Build Coastguard Worker {
1806*f6dc9357SAndroid Build Coastguard Worker NSynchronization::CCriticalSectionLock lock(sync.CS);
1807*f6dc9357SAndroid Build Coastguard Worker sync.BenchFinish_Thread_HRESULT = finishHRESULT;
1808*f6dc9357SAndroid Build Coastguard Worker }
1809*f6dc9357SAndroid Build Coastguard Worker if (!BenchmarkDialog->PostMsg_Finish(k_Msg_WPARM_Thread_Finished))
1810*f6dc9357SAndroid Build Coastguard Worker {
1811*f6dc9357SAndroid Build Coastguard Worker // sync.BenchFinish_Thread_HRESULT = E_FAIL;
1812*f6dc9357SAndroid Build Coastguard Worker }
1813*f6dc9357SAndroid Build Coastguard Worker return 0;
1814*f6dc9357SAndroid Build Coastguard Worker }
1815*f6dc9357SAndroid Build Coastguard Worker
1816*f6dc9357SAndroid Build Coastguard Worker
1817*f6dc9357SAndroid Build Coastguard Worker
1818*f6dc9357SAndroid Build Coastguard Worker static void ParseNumberString(const UString &s, NCOM::CPropVariant &prop)
1819*f6dc9357SAndroid Build Coastguard Worker {
1820*f6dc9357SAndroid Build Coastguard Worker const wchar_t *end;
1821*f6dc9357SAndroid Build Coastguard Worker UInt64 result = ConvertStringToUInt64(s, &end);
1822*f6dc9357SAndroid Build Coastguard Worker if (*end != 0 || s.IsEmpty())
1823*f6dc9357SAndroid Build Coastguard Worker prop = s;
1824*f6dc9357SAndroid Build Coastguard Worker else if (result <= (UInt32)0xFFFFFFFF)
1825*f6dc9357SAndroid Build Coastguard Worker prop = (UInt32)result;
1826*f6dc9357SAndroid Build Coastguard Worker else
1827*f6dc9357SAndroid Build Coastguard Worker prop = result;
1828*f6dc9357SAndroid Build Coastguard Worker }
1829*f6dc9357SAndroid Build Coastguard Worker
1830*f6dc9357SAndroid Build Coastguard Worker
1831*f6dc9357SAndroid Build Coastguard Worker HRESULT Benchmark(
1832*f6dc9357SAndroid Build Coastguard Worker DECL_EXTERNAL_CODECS_LOC_VARS
1833*f6dc9357SAndroid Build Coastguard Worker const CObjectVector<CProperty> &props, UInt32 numIterations, HWND hwndParent)
1834*f6dc9357SAndroid Build Coastguard Worker {
1835*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog bd;
1836*f6dc9357SAndroid Build Coastguard Worker
1837*f6dc9357SAndroid Build Coastguard Worker bd.TotalMode = false;
1838*f6dc9357SAndroid Build Coastguard Worker bd.Props = props;
1839*f6dc9357SAndroid Build Coastguard Worker if (numIterations == 0)
1840*f6dc9357SAndroid Build Coastguard Worker numIterations = 1;
1841*f6dc9357SAndroid Build Coastguard Worker bd.Sync.NumPasses_Limit = numIterations;
1842*f6dc9357SAndroid Build Coastguard Worker bd.Sync.DictSize = (UInt64)(Int64)-1;
1843*f6dc9357SAndroid Build Coastguard Worker bd.Sync.NumThreads = (UInt32)(Int32)-1;
1844*f6dc9357SAndroid Build Coastguard Worker bd.Sync.Level = -1;
1845*f6dc9357SAndroid Build Coastguard Worker
1846*f6dc9357SAndroid Build Coastguard Worker COneMethodInfo method;
1847*f6dc9357SAndroid Build Coastguard Worker
1848*f6dc9357SAndroid Build Coastguard Worker UInt32 numCPUs = 1;
1849*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
1850*f6dc9357SAndroid Build Coastguard Worker numCPUs = NSystem::GetNumberOfProcessors();
1851*f6dc9357SAndroid Build Coastguard Worker #endif
1852*f6dc9357SAndroid Build Coastguard Worker UInt32 numThreads = numCPUs;
1853*f6dc9357SAndroid Build Coastguard Worker
1854*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR (i, props)
1855*f6dc9357SAndroid Build Coastguard Worker {
1856*f6dc9357SAndroid Build Coastguard Worker const CProperty &prop = props[i];
1857*f6dc9357SAndroid Build Coastguard Worker UString name = prop.Name;
1858*f6dc9357SAndroid Build Coastguard Worker name.MakeLower_Ascii();
1859*f6dc9357SAndroid Build Coastguard Worker if (name.IsEqualTo_Ascii_NoCase("m") && prop.Value == L"*")
1860*f6dc9357SAndroid Build Coastguard Worker {
1861*f6dc9357SAndroid Build Coastguard Worker bd.TotalMode = true;
1862*f6dc9357SAndroid Build Coastguard Worker continue;
1863*f6dc9357SAndroid Build Coastguard Worker }
1864*f6dc9357SAndroid Build Coastguard Worker
1865*f6dc9357SAndroid Build Coastguard Worker NCOM::CPropVariant propVariant;
1866*f6dc9357SAndroid Build Coastguard Worker if (!prop.Value.IsEmpty())
1867*f6dc9357SAndroid Build Coastguard Worker ParseNumberString(prop.Value, propVariant);
1868*f6dc9357SAndroid Build Coastguard Worker if (name.IsPrefixedBy(L"mt"))
1869*f6dc9357SAndroid Build Coastguard Worker {
1870*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
1871*f6dc9357SAndroid Build Coastguard Worker RINOK(ParseMtProp(name.Ptr(2), propVariant, numCPUs, numThreads))
1872*f6dc9357SAndroid Build Coastguard Worker if (numThreads != numCPUs)
1873*f6dc9357SAndroid Build Coastguard Worker bd.Sync.NumThreads = numThreads;
1874*f6dc9357SAndroid Build Coastguard Worker #endif
1875*f6dc9357SAndroid Build Coastguard Worker continue;
1876*f6dc9357SAndroid Build Coastguard Worker }
1877*f6dc9357SAndroid Build Coastguard Worker /*
1878*f6dc9357SAndroid Build Coastguard Worker if (name.IsEqualTo("time"))
1879*f6dc9357SAndroid Build Coastguard Worker {
1880*f6dc9357SAndroid Build Coastguard Worker // UInt32 testTime = 4;
1881*f6dc9357SAndroid Build Coastguard Worker // RINOK(ParsePropToUInt32(L"", propVariant, testTime));
1882*f6dc9357SAndroid Build Coastguard Worker continue;
1883*f6dc9357SAndroid Build Coastguard Worker }
1884*f6dc9357SAndroid Build Coastguard Worker RINOK(method.ParseMethodFromPROPVARIANT(name, propVariant));
1885*f6dc9357SAndroid Build Coastguard Worker */
1886*f6dc9357SAndroid Build Coastguard Worker // here we need to parse DictSize property, and ignore unknown properties
1887*f6dc9357SAndroid Build Coastguard Worker method.ParseMethodFromPROPVARIANT(name, propVariant);
1888*f6dc9357SAndroid Build Coastguard Worker }
1889*f6dc9357SAndroid Build Coastguard Worker
1890*f6dc9357SAndroid Build Coastguard Worker if (bd.TotalMode)
1891*f6dc9357SAndroid Build Coastguard Worker {
1892*f6dc9357SAndroid Build Coastguard Worker // bd.Bench2Text.Empty();
1893*f6dc9357SAndroid Build Coastguard Worker bd.Bench2Text = "7-Zip " MY_VERSION_CPU;
1894*f6dc9357SAndroid Build Coastguard Worker // bd.Bench2Text.Add_Char((char)0xD);
1895*f6dc9357SAndroid Build Coastguard Worker bd.Bench2Text.Add_LF();
1896*f6dc9357SAndroid Build Coastguard Worker }
1897*f6dc9357SAndroid Build Coastguard Worker
1898*f6dc9357SAndroid Build Coastguard Worker {
1899*f6dc9357SAndroid Build Coastguard Worker UInt64 dict;
1900*f6dc9357SAndroid Build Coastguard Worker if (method.Get_DicSize(dict))
1901*f6dc9357SAndroid Build Coastguard Worker bd.Sync.DictSize = dict;
1902*f6dc9357SAndroid Build Coastguard Worker }
1903*f6dc9357SAndroid Build Coastguard Worker bd.Sync.Level = (int)method.GetLevel();
1904*f6dc9357SAndroid Build Coastguard Worker
1905*f6dc9357SAndroid Build Coastguard Worker // Dummy(1000 * 1000 * 1);
1906*f6dc9357SAndroid Build Coastguard Worker
1907*f6dc9357SAndroid Build Coastguard Worker {
1908*f6dc9357SAndroid Build Coastguard Worker CThreadBenchmark &benchmarker = bd._threadBenchmark;
1909*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_EXTERNAL_CODECS
1910*f6dc9357SAndroid Build Coastguard Worker benchmarker._externalCodecs = _externalCodecs;
1911*f6dc9357SAndroid Build Coastguard Worker #endif
1912*f6dc9357SAndroid Build Coastguard Worker benchmarker.BenchmarkDialog = &bd;
1913*f6dc9357SAndroid Build Coastguard Worker }
1914*f6dc9357SAndroid Build Coastguard Worker
1915*f6dc9357SAndroid Build Coastguard Worker bd.Create(hwndParent);
1916*f6dc9357SAndroid Build Coastguard Worker
1917*f6dc9357SAndroid Build Coastguard Worker return S_OK;
1918*f6dc9357SAndroid Build Coastguard Worker }
1919*f6dc9357SAndroid Build Coastguard Worker
1920*f6dc9357SAndroid Build Coastguard Worker
1921*f6dc9357SAndroid Build Coastguard Worker CBenchmarkDialog::~CBenchmarkDialog()
1922*f6dc9357SAndroid Build Coastguard Worker {
1923*f6dc9357SAndroid Build Coastguard Worker if (_thread.IsCreated())
1924*f6dc9357SAndroid Build Coastguard Worker {
1925*f6dc9357SAndroid Build Coastguard Worker /* the following code will be not executed in normal code flow.
1926*f6dc9357SAndroid Build Coastguard Worker it can be called, if there is some internal failure in dialog code. */
1927*f6dc9357SAndroid Build Coastguard Worker Attach(NULL);
1928*f6dc9357SAndroid Build Coastguard Worker MessageBoxError(L"The flaw in benchmark thread code");
1929*f6dc9357SAndroid Build Coastguard Worker Sync.SendExit();
1930*f6dc9357SAndroid Build Coastguard Worker _thread.Wait_Close();
1931*f6dc9357SAndroid Build Coastguard Worker }
1932*f6dc9357SAndroid Build Coastguard Worker }
1933