Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
B
benchmark
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
benchmark
Commits
b3f0d71e
Commit
b3f0d71e
authored
Dec 19, 2013
by
Dominic Hamon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
benchmark_min_time now works as expected
parent
a94b0a67
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
50 additions
and
50 deletions
+50
-50
benchmark.h
include/benchmark/benchmark.h
+0
-1
benchmark.cc
src/benchmark.cc
+44
-39
sleep.cc
src/sleep.cc
+1
-10
sleep.h
src/sleep.h
+5
-0
No files found.
include/benchmark/benchmark.h
View file @
b3f0d71e
...
...
@@ -233,7 +233,6 @@ class State {
bool
MaybeStop
();
void
NewInterval
();
bool
AllStarting
();
bool
RunAnotherInterval
()
const
;
void
Run
();
...
...
src/benchmark.cc
View file @
b3f0d71e
...
...
@@ -29,11 +29,9 @@ DEFINE_string(benchmark_filter, ".",
"If this flag is the string
\"
all
\"
, all benchmarks linked "
"into the process are run."
);
DEFINE_int32
(
benchmark_min_iters
,
100
,
"Minimum number of iterations per benchmark"
);
DEFINE_int32
(
benchmark_max_iters
,
1000000000
,
"Maximum number of iterations per benchmark"
);
DEFINE_int32
(
benchmark_iterations
,
0
,
"Total number of iterations per benchmark. 0 means the benchmarks "
"are time-based."
);
DEFINE_double
(
benchmark_min_time
,
0.5
,
"Minimum number of seconds we should run benchmark before "
...
...
@@ -69,15 +67,13 @@ DECLARE_string(heap_check);
: NULL )
namespace
benchmark
{
namespace
{
// kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta.
static
const
char
kBigSIUnits
[]
=
"kMGTPEZY"
;
const
char
kBigSIUnits
[]
=
"kMGTPEZY"
;
// Kibi, Mebi, Gibi, Tebi, Pebi, Exbi, Zebi, Yobi.
static
const
char
kBigIECUnits
[]
=
"KMGTPEZY"
;
const
char
kBigIECUnits
[]
=
"KMGTPEZY"
;
// milli, micro, nano, pico, femto, atto, zepto, yocto.
static
const
char
kSmallSIUnits
[]
=
"munpfazy"
;
const
char
kSmallSIUnits
[]
=
"munpfazy"
;
// We require that all three arrays have the same size.
static_assert
(
arraysize
(
kBigSIUnits
)
==
arraysize
(
kBigIECUnits
),
...
...
@@ -427,9 +423,8 @@ void UseRealTime() {
void
PrintUsageAndExit
()
{
fprintf
(
stdout
,
"benchmark [--benchmark_filter=<regex>]
\n
"
// TODO " [--benchmark_min_iters=<min_iters>]\n"
// TODO " [--benchmark_max_iters=<max_iters>]\n"
// TODO " [--benchmark_min_time=<min_time>]\n"
// TODO " [--benchmark_iterations=<iterations>]\n"
" [--benchmark_min_time=<min_time>]
\n
"
// " [--benchmark_memory_usage]\n"
// TODO " [--benchmark_repetitions=<num_repetitions>]\n"
" [--color_print={true|false}]
\n
"
...
...
@@ -441,16 +436,16 @@ void ParseCommandLineFlags(int* argc, const char** argv) {
for
(
int
i
=
1
;
i
<
*
argc
;
++
i
)
{
if
(
ParseStringFlag
(
argv
[
i
],
"benchmark_filter"
,
&
FLAGS_benchmark_filter
)
||
/* TODO(dominic)
ParseInt32Flag(argv[i], "benchmark_min_iters",
&FLAGS_benchmark_min_iters) ||
ParseInt32Flag(argv[i], "benchmark_max_iters",
&FLAGS_benchmark_max_iters) ||
/* TODO
ParseInt32Flag(argv[i], "benchmark_iterations",
&FLAGS_benchmark_iterations) ||
*/
ParseDoubleFlag
(
argv
[
i
],
"benchmark_min_time"
,
&
FLAGS_benchmark_min_time
)
||
// TODO(dominic)
// ParseBoolFlag(argv[i], "gbenchmark_memory_usage",
// &FLAGS_gbenchmark_memory_usage) ||
/*
ParseInt32Flag(argv[i], "benchmark_repetitions",
&FLAGS_benchmark_repetitions) ||
*/
...
...
@@ -504,7 +499,7 @@ class State::FastClock {
t
=
MyCPUUsage
()
+
ChildrenCPUUsage
();
break
;
}
return
static_cast
<
int64_t
>
(
t
*
1e6
);
return
static_cast
<
int64_t
>
(
t
*
kNumMicrosPerSecond
);
}
// Reinitialize if necessary (since clock type may be change once benchmark
...
...
@@ -577,6 +572,10 @@ struct State::SharedState {
SharedState
(
const
internal
::
Benchmark
::
Instance
*
b
,
int
t
)
:
instance
(
b
),
starting
(
0
),
stopping
(
0
),
threads
(
t
)
{
pthread_mutex_init
(
&
mu
,
nullptr
);
}
~
SharedState
()
{
pthread_mutex_destroy
(
&
mu
);
}
DISALLOW_COPY_AND_ASSIGN
(
SharedState
);
};
...
...
@@ -907,13 +906,17 @@ State::State(FastClock* clock, SharedState* s, int t)
pause_time_
(
0.0
),
total_iterations_
(
0
),
interval_micros_
(
static_cast
<
int64_t
>
(
1e6
*
FLAGS_benchmark_min_time
/
static_cast
<
int64_t
>
(
kNumMicrosPerSecond
*
FLAGS_benchmark_min_time
/
FLAGS_benchmark_repetitions
))
{
CHECK
(
clock
!=
nullptr
);
CHECK
(
s
!=
nullptr
);
}
bool
State
::
KeepRunning
()
{
// Fast path
if
(
!
clock_
->
HasReached
(
stop_time_micros_
+
pause_time_
))
{
if
((
FLAGS_benchmark_iterations
==
0
&&
!
clock_
->
HasReached
(
stop_time_micros_
+
pause_time_
))
||
iterations_
<
FLAGS_benchmark_iterations
)
{
++
iterations_
;
return
true
;
}
...
...
@@ -1029,12 +1032,12 @@ void State::NewInterval() {
}
bool
State
::
FinishInterval
()
{
if
(
iterations_
<
FLAGS_benchmark_min_iters
/
FLAGS_benchmark_repetitions
&&
i
nterval_micros_
<
5000000
)
{
if
(
FLAGS_benchmark_iterations
!=
0
&&
i
terations_
<
FLAGS_benchmark_iterations
/
FLAGS_benchmark_repetitions
)
{
interval_micros_
*=
2
;
#ifdef DEBUG
std
::
cout
<<
"
Interval was too short; trying again for
"
<<
interval_micros_
<<
" useconds.
\n
"
;
std
::
cout
<<
"
Not enough iterations in interval;
"
<<
"Trying again for "
<<
interval_micros_
<<
" useconds.
\n
"
;
#endif
is_continuation_
=
false
;
NewInterval
();
...
...
@@ -1058,11 +1061,25 @@ bool State::FinishInterval() {
bool
keep_going
=
false
;
{
mutex_lock
l
(
&
shared_
->
mu
);
// Either replace the last or add a new data point.
if
(
is_continuation_
)
shared_
->
runs
.
back
()
=
data
;
else
shared_
->
runs
.
push_back
(
data
);
keep_going
=
RunAnotherInterval
();
if
(
FLAGS_benchmark_iterations
!=
0
)
{
// If we need more iterations, run another interval as a continuation.
keep_going
=
total_iterations_
<
FLAGS_benchmark_iterations
;
is_continuation_
=
keep_going
;
}
else
{
// If this is a repetition, run another interval as a new data point.
keep_going
=
shared_
->
runs
.
size
()
<
static_cast
<
size_t
>
(
FLAGS_benchmark_repetitions
);
is_continuation_
=
!
keep_going
;
}
if
(
!
keep_going
)
{
++
shared_
->
stopping
;
if
(
shared_
->
stopping
<
shared_
->
threads
)
{
...
...
@@ -1076,23 +1093,11 @@ bool State::FinishInterval() {
}
}
if
(
state_
==
STATE_RUNNING
)
{
is_continuation_
=
true
;
if
(
state_
==
STATE_RUNNING
)
NewInterval
();
}
return
keep_going
;
}
bool
State
::
RunAnotherInterval
()
const
{
if
(
total_iterations_
<
FLAGS_benchmark_min_iters
)
return
true
;
if
(
total_iterations_
>
FLAGS_benchmark_max_iters
)
return
false
;
if
(
static_cast
<
int
>
(
shared_
->
runs
.
size
())
>=
FLAGS_benchmark_repetitions
)
return
false
;
return
true
;
}
bool
State
::
MaybeStop
()
{
mutex_lock
l
(
&
shared_
->
mu
);
if
(
shared_
->
stopping
<
shared_
->
threads
)
{
...
...
src/sleep.cc
View file @
b3f0d71e
...
...
@@ -5,22 +5,14 @@
namespace
benchmark
{
#ifdef OS_WINDOWS
// Window's _sleep takes milliseconds argument.
void
SleepForMilliseconds
(
int
milliseconds
)
{
_sleep
(
milliseconds
);
}
void
SleepForSeconds
(
double
seconds
)
{
SleepForMilliseconds
(
static_cast
<
int
>
(
seconds
*
1000
));
SleepForMilliseconds
(
static_cast
<
int
>
(
kNumMillisPerSecond
*
seconds
));
}
#else // OS_WINDOWS
static
const
int64_t
kNumMillisPerSecond
=
1000LL
;
static
const
int64_t
kNumMicrosPerMilli
=
1000LL
;
static
const
int64_t
kNumMicrosPerSecond
=
kNumMillisPerSecond
*
1000LL
;
static
const
int64_t
kNumNanosPerMicro
=
1000LL
;
void
SleepForMicroseconds
(
int64_t
microseconds
)
{
struct
timespec
sleep_time
;
sleep_time
.
tv_sec
=
microseconds
/
kNumMicrosPerSecond
;
...
...
@@ -36,7 +28,6 @@ void SleepForMilliseconds(int milliseconds) {
void
SleepForSeconds
(
double
seconds
)
{
SleepForMicroseconds
(
static_cast
<
int64_t
>
(
seconds
*
kNumMicrosPerSecond
));
}
#endif // OS_WINDOWS
}
// end namespace benchmark
src/sleep.h
View file @
b3f0d71e
...
...
@@ -4,6 +4,11 @@
#include <stdint.h>
namespace
benchmark
{
const
int64_t
kNumMillisPerSecond
=
1000LL
;
const
int64_t
kNumMicrosPerMilli
=
1000LL
;
const
int64_t
kNumMicrosPerSecond
=
kNumMillisPerSecond
*
1000LL
;
const
int64_t
kNumNanosPerMicro
=
1000LL
;
void
SleepForMicroseconds
(
int64_t
microseconds
);
void
SleepForMilliseconds
(
int
milliseconds
);
void
SleepForSeconds
(
double
seconds
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment