source: trunk/src/testlib/qbenchmark.cpp@ 1023

Last change on this file since 1023 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 8.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtTest module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "QtTest/qbenchmark.h"
43#include "QtTest/private/qbenchmark_p.h"
44#include "QtTest/private/qbenchmarkmetric_p.h"
45
46#ifdef QT_GUI_LIB
47#include <QtGui/qapplication.h>
48#endif
49
50#include <QtCore/qprocess.h>
51#include <QtCore/qdir.h>
52#include <QtCore/qset.h>
53#include <QtCore/qdebug.h>
54
55QT_BEGIN_NAMESPACE
56
57QBenchmarkGlobalData *QBenchmarkGlobalData::current;
58
59QBenchmarkGlobalData::QBenchmarkGlobalData()
60 : measurer(0)
61 , walltimeMinimum(-1)
62 , iterationCount(-1)
63 , medianIterationCount(-1)
64 , createChart(false)
65 , verboseOutput(false)
66 , mode_(WallTime)
67{
68 setMode(mode_);
69}
70
71QBenchmarkGlobalData::~QBenchmarkGlobalData()
72{
73 delete measurer;
74 QBenchmarkGlobalData::current = 0;
75}
76
77void QBenchmarkGlobalData::setMode(Mode mode)
78{
79 mode_ = mode;
80
81 if (measurer)
82 delete measurer;
83 measurer = createMeasurer();
84}
85
86QBenchmarkMeasurerBase * QBenchmarkGlobalData::createMeasurer()
87{
88 QBenchmarkMeasurerBase *measurer = 0;
89 if (0) {
90#ifdef QTESTLIB_USE_VALGRIND
91 } else if (mode_ == CallgrindChildProcess || mode_ == CallgrindParentProcess) {
92 measurer = new QBenchmarkCallgrindMeasurer;
93#endif
94#ifdef HAVE_TICK_COUNTER
95 } else if (mode_ == TickCounter) {
96 measurer = new QBenchmarkTickMeasurer;
97#endif
98 } else if (mode_ == EventCounter) {
99 measurer = new QBenchmarkEvent;
100 } else {
101 measurer = new QBenchmarkTimeMeasurer;
102 }
103 measurer->init();
104 return measurer;
105}
106
107int QBenchmarkGlobalData::adjustMedianIterationCount()
108{
109 if (medianIterationCount != -1) {
110 return medianIterationCount;
111 } else {
112 return measurer->adjustMedianCount(1);
113 }
114}
115
116
117QBenchmarkTestMethodData *QBenchmarkTestMethodData::current;
118
119QBenchmarkTestMethodData::QBenchmarkTestMethodData()
120:resultAccepted(false), runOnce(false), iterationCount(-1)
121{
122
123}
124
125QBenchmarkTestMethodData::~QBenchmarkTestMethodData()
126{
127 QBenchmarkTestMethodData::current = 0;
128}
129
130void QBenchmarkTestMethodData::beginDataRun()
131{
132 iterationCount = adjustIterationCount(1);
133}
134
135void QBenchmarkTestMethodData::endDataRun()
136{
137
138}
139
140int QBenchmarkTestMethodData::adjustIterationCount(int suggestion)
141{
142 // Let the -iterations option override the measurer.
143 if (QBenchmarkGlobalData::current->iterationCount != -1) {
144 iterationCount = QBenchmarkGlobalData::current->iterationCount;
145 } else {
146 iterationCount = QBenchmarkGlobalData::current->measurer->adjustIterationCount(suggestion);
147 }
148
149 return iterationCount;
150}
151
152void QBenchmarkTestMethodData::setResult(
153 qreal value, QTest::QBenchmarkMetric metric, bool setByMacro)
154{
155 bool accepted = false;
156
157 // Always accept the result if the iteration count has been
158 // specified on the command line with -iterations.
159 if (QBenchmarkGlobalData::current->iterationCount != -1)
160 accepted = true;
161
162 else if (QBenchmarkTestMethodData::current->runOnce || !setByMacro) {
163 iterationCount = 1;
164 accepted = true;
165 }
166
167 // Test the result directly without calling the measurer if the minimum time
168 // has been specified on the command line with -minimumvalue.
169 else if (QBenchmarkGlobalData::current->walltimeMinimum != -1)
170 accepted = (value > QBenchmarkGlobalData::current->walltimeMinimum);
171 else
172 accepted = QBenchmarkGlobalData::current->measurer->isMeasurementAccepted(value);
173
174 // Accept the result or double the number of iterations.
175 if (accepted)
176 resultAccepted = true;
177 else
178 iterationCount *= 2;
179
180 this->result = QBenchmarkResult(
181 QBenchmarkGlobalData::current->context, value, iterationCount, metric, setByMacro);
182}
183
184/*!
185 \class QTest::QBenchmarkIterationController
186 \internal
187
188 The QBenchmarkIterationController class is used by the QBENCHMARK macro to
189 drive the benchmarking loop. It is repsonsible for starting and stopping
190 the timing measurements as well as calling the result reporting functions.
191*/
192
193/*! \internal
194*/
195QTest::QBenchmarkIterationController::QBenchmarkIterationController(RunMode runMode)
196{
197 i = 0;
198 if (runMode == RunOnce)
199 QBenchmarkTestMethodData::current->runOnce = true;
200 QTest::beginBenchmarkMeasurement();
201}
202
203QTest::QBenchmarkIterationController::QBenchmarkIterationController()