Benchmark or performance-testing is often as important as unit test in many environment such as server side development. GTESTX is just a convenient and simple C++ benchmark tool. It is based on gtest framework, so if you are familiar with gtest you can write benchmark code easily only by knowing some extended macros.
PERF_TEST (similar with TEST macro) is a simplest gtestx macro. By default the function body will be called in a dead loop for a period of time and then the performance counter recorded is reported.
This is an example:
#include <sys/types.h>
#include <unistd.h>
#include "gtestx/gtestx.h"
TEST(SimpleTest, SysCall)
{
ASSERT_NE(0, getppid());
}
// Just like TEST macro, use PERF_TEST for performance testing
PERF_TEST(SimpleTest, SysCallPerf)
{
getppid();
}
We can run it as normal gtest tests:
$ ./gtestx_examples --gtest_filter='SimpleTest*'
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from SimpleTest
[ RUN ] SimpleTest.SysCall
[ OK ] SimpleTest.SysCall (0 ms)
[ RUN ] SimpleTest.SysCallPerf
count: 25,369,636
time: 1.508939 s
HZ: 16,812,897.009090
1/HZ: 0.000000059 s
[ OK ] SimpleTest.SysCallPerf (1509 ms)
[----------] 2 tests from SimpleTest (1509 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1510 ms total)
[ PASSED ] 2 tests.
Another example:
class StdMapTest : public testing::Test
{
protected:
virtual ~StdMapTest() {}
virtual void SetUp() override {
for (int i = 0; i < 1000; i++) {
map_.emplace(i, 1);
}
}
virtual void TearDown() override {}
std::map<int,int> map_;
};
PERF_TEST_F(StdMapTest, FindPerf)
{
map_.find(999);
}
Almost all gtest macro has a GTESTX version:
- PERF_TEST
- PERF_TEST_F
- PERF_TEST_P
- TYPED_PERF_TEST
- TYPED_PERF_TEST_P
And there are some more macros which can be used with additional options:
- PERF_TEST_OPT
- PERF_TEST_F_OPT
- PERF_TEST_P_OPT
- TYPED_PERF_TEST_OPT
- TYPED_PERF_TEST_P_OPT
You can learn how to use them by read example code in examples directory.
- gtest (>= 1.7 is well tested)
- gflags (>= 2.0 is well tested)
Actually all gtestx code (without tests and examples) are only two files - gtestx.h and gtestx.cc, so you can import them into your projects easily.
A Bazel BUILD file is also available, you can use it to build tests and examples or linked it to other bazel project. Note that this bazel BUILD depends on gtest and gflags modules which are modified-for-bazel version on my github.
For example you can build examples as follows:
mkdir work
cd work
touch WORKSPACE
git clone https://github.com/mikewei/gtestx.git
git clone https://github.com/mikewei/third_party.git
bazel build gtestx:examples
You can also build tests and examples using Makefile:
git clone https://github.com/mikewei/gtestx.git
cd examples
# change some directory setting in Makefile
make
Run GTESTX benchmark tests just as normal gtest tests. e.g.
./gtestx_examples --gtest_filters='SimpleTest.*'
Or run within bazel:
bazel run gtestx:examples -- --gtest_filter='SimpleTest.*'
Also GTESTX supply two more command line options:
-hz CALLS_PER_SECOND
-time RUNNING_MILLISECONDS
For example if you want run SimpleTest with 10000 times/sec for 10 seconds, use commonds bellow:
./gtestx_examples --gtest_filters='SimpleTest.*' -hz=10000 -time=10000
这里有一篇介绍如何使用gtestx的文章。