3 #include "../src/perf_counters.h"
4 #include "gtest/gtest.h"
10 #define GTEST_SKIP() return MsgHandler() = std::cout
17 const char kGenericPerfEvent1[] =
"CYCLES";
18 const char kGenericPerfEvent2[] =
"BRANCHES";
19 const char kGenericPerfEvent3[] =
"INSTRUCTIONS";
25 TEST(PerfCountersTest, OneCounter) {
26 if (!PerfCounters::kSupported) {
27 GTEST_SKIP() <<
"Performance counters not supported.\n";
30 EXPECT_TRUE(PerfCounters::Create({kGenericPerfEvent1}).IsValid());
33 TEST(PerfCountersTest, NegativeTest) {
34 if (!PerfCounters::kSupported) {
41 EXPECT_FALSE(PerfCounters::Create({
"not a counter name"}).IsValid());
43 EXPECT_TRUE(PerfCounters::Create({kGenericPerfEvent1, kGenericPerfEvent2,
48 PerfCounters::Create({kGenericPerfEvent2,
"", kGenericPerfEvent1})
50 EXPECT_FALSE(PerfCounters::Create({kGenericPerfEvent3,
"not a counter name",
54 EXPECT_TRUE(PerfCounters::Create({kGenericPerfEvent1, kGenericPerfEvent2,
59 PerfCounters::Create({kGenericPerfEvent1, kGenericPerfEvent2,
60 kGenericPerfEvent3,
"MISPREDICTED_BRANCH_RETIRED"})
64 TEST(PerfCountersTest, Read1Counter) {
65 if (!PerfCounters::kSupported) {
66 GTEST_SKIP() <<
"Test skipped because libpfm is not supported.\n";
69 auto counters = PerfCounters::Create({kGenericPerfEvent1});
80 TEST(PerfCountersTest, Read2Counters) {
81 if (!PerfCounters::kSupported) {
82 GTEST_SKIP() <<
"Test skipped because libpfm is not supported.\n";
86 PerfCounters::Create({kGenericPerfEvent1, kGenericPerfEvent2});
100 for (
size_t i = 0;
i < 100000000; ++
i) res +=
i *
i;
108 std::vector<std::thread>
threads(threadcount);
117 PerfCounters::Create({kGenericPerfEvent1, kGenericPerfEvent3});
119 counters.Snapshot(values1);
120 for (
auto& t :
threads) t.join();
121 counters.Snapshot(values2);
124 TEST(PerfCountersTest, MultiThreaded) {
125 if (!PerfCounters::kSupported) {
126 GTEST_SKIP() <<
"Test skipped because libpfm is not supported.";
132 measure(2, &values1, &values2);
133 std::vector<double> D1{
static_cast<double>(values2[0] - values1[0]),
134 static_cast<double>(values2[1] - values1[1])};
136 measure(4, &values1, &values2);
137 std::vector<double> D2{
static_cast<double>(values2[0] - values1[0]),
138 static_cast<double>(values2[1] - values1[1])};