blob: 33b139c88a2722ae20a6dc2f85b83b2b9bfb2f03 [file] [log] [blame]
Clement Courbetac74acd2018-04-04 11:37:06 +00001//===-- BenchmarkResultTest.cpp ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "BenchmarkResult.h"
11#include "llvm/ADT/SmallString.h"
12#include "llvm/Support/Error.h"
Clement Courbet308f8b72018-04-13 13:37:07 +000013#include "llvm/Support/Path.h"
Clement Courbetac74acd2018-04-04 11:37:06 +000014#include "llvm/Support/YAMLTraits.h"
15#include "llvm/Support/raw_ostream.h"
16#include "gmock/gmock.h"
17#include "gtest/gtest.h"
18
19namespace exegesis {
20
21bool operator==(const BenchmarkMeasure &A, const BenchmarkMeasure &B) {
22 return std::tie(A.Key, A.Value) == std::tie(B.Key, B.Value);
23}
24
25namespace {
26
27TEST(BenchmarkResultTest, WriteToAndReadFromDisk) {
28 InstructionBenchmark ToDisk;
29
Clement Courbeta66bfaa42018-05-15 13:07:05 +000030 ToDisk.Key.OpcodeName = "name";
31 ToDisk.Key.Mode = "mode";
32 ToDisk.Key.Config = "config";
Clement Courbetac74acd2018-04-04 11:37:06 +000033 ToDisk.CpuName = "cpu_name";
34 ToDisk.LLVMTriple = "llvm_triple";
35 ToDisk.NumRepetitions = 1;
36 ToDisk.Measurements.push_back(BenchmarkMeasure{"a", 1, "debug a"});
Clement Courbet3f20fee2018-04-04 12:01:38 +000037 ToDisk.Measurements.push_back(BenchmarkMeasure{"b", 2, ""});
Clement Courbetac74acd2018-04-04 11:37:06 +000038 ToDisk.Error = "error";
Clement Courbeta66bfaa42018-05-15 13:07:05 +000039 ToDisk.Info = "info";
Clement Courbetac74acd2018-04-04 11:37:06 +000040
Clement Courbet308f8b72018-04-13 13:37:07 +000041 llvm::SmallString<64> Filename;
42 std::error_code EC;
43 EC = llvm::sys::fs::createUniqueDirectory("BenchmarkResultTestDir", Filename);
44 ASSERT_FALSE(EC);
45 llvm::sys::path::append(Filename, "data.yaml");
Clement Courbetac74acd2018-04-04 11:37:06 +000046
47 ToDisk.writeYamlOrDie(Filename);
48
49 {
Clement Courbet7b7c27a2018-05-14 09:01:22 +000050 // One-element version.
Clement Courbetac74acd2018-04-04 11:37:06 +000051 const auto FromDisk = InstructionBenchmark::readYamlOrDie(Filename);
52
Clement Courbeta66bfaa42018-05-15 13:07:05 +000053 EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName);
54 EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode);
55 EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
Clement Courbetac74acd2018-04-04 11:37:06 +000056 EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
57 EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
58 EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions);
59 EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements);
60 EXPECT_THAT(FromDisk.Error, ToDisk.Error);
Clement Courbeta66bfaa42018-05-15 13:07:05 +000061 EXPECT_EQ(FromDisk.Info, ToDisk.Info);
Clement Courbetac74acd2018-04-04 11:37:06 +000062 }
Clement Courbet7b7c27a2018-05-14 09:01:22 +000063 {
64 // Vector version.
65 const auto FromDiskVector = InstructionBenchmark::readYamlsOrDie(Filename);
Clement Courbet4c0fb1d2018-05-14 12:00:35 +000066 ASSERT_EQ(FromDiskVector.size(), size_t{1});
Clement Courbet7b7c27a2018-05-14 09:01:22 +000067 const auto FromDisk = FromDiskVector[0];
Clement Courbeta66bfaa42018-05-15 13:07:05 +000068 EXPECT_EQ(FromDisk.Key.OpcodeName, ToDisk.Key.OpcodeName);
69 EXPECT_EQ(FromDisk.Key.Mode, ToDisk.Key.Mode);
70 EXPECT_EQ(FromDisk.Key.Config, ToDisk.Key.Config);
Clement Courbet7b7c27a2018-05-14 09:01:22 +000071 EXPECT_EQ(FromDisk.CpuName, ToDisk.CpuName);
72 EXPECT_EQ(FromDisk.LLVMTriple, ToDisk.LLVMTriple);
73 EXPECT_EQ(FromDisk.NumRepetitions, ToDisk.NumRepetitions);
74 EXPECT_THAT(FromDisk.Measurements, ToDisk.Measurements);
75 EXPECT_THAT(FromDisk.Error, ToDisk.Error);
Clement Courbeta66bfaa42018-05-15 13:07:05 +000076 EXPECT_EQ(FromDisk.Info, ToDisk.Info);
Clement Courbet7b7c27a2018-05-14 09:01:22 +000077 }
Clement Courbetac74acd2018-04-04 11:37:06 +000078}
79
Clement Courbetae8ae5dc2018-05-24 12:41:02 +000080TEST(BenchmarkResultTest, BenchmarkMeasureStats) {
81 BenchmarkMeasureStats Stats;
82 Stats.push(BenchmarkMeasure{"a", 0.5, "debug a"});
83 Stats.push(BenchmarkMeasure{"a", 1.5, "debug a"});
84 Stats.push(BenchmarkMeasure{"a", -1.0, "debug a"});
85 Stats.push(BenchmarkMeasure{"a", 0.0, "debug a"});
86 EXPECT_EQ(Stats.min(), -1.0);
87 EXPECT_EQ(Stats.max(), 1.5);
88 EXPECT_EQ(Stats.avg(), 0.25); // (0.5+1.5-1.0+0.0) / 4
89}
Clement Courbetac74acd2018-04-04 11:37:06 +000090} // namespace
91} // namespace exegesis