• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2018 The TensorFlow Authors. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7     http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 #include "tensorflow/lite/profiling/profile_buffer.h"
16 
17 #include <algorithm>
18 #include <cstdint>
19 #include <string>
20 #include <vector>
21 
22 #include <gmock/gmock.h>
23 #include <gtest/gtest.h>
24 
25 namespace tflite {
26 namespace profiling {
27 
28 namespace {
29 
GetProfileEvents(const ProfileBuffer & buffer)30 std::vector<const ProfileEvent*> GetProfileEvents(const ProfileBuffer& buffer) {
31   std::vector<const ProfileEvent*> events;
32   for (size_t i = 0; i < buffer.Size(); i++) {
33     events.push_back(buffer.At(i));
34   }
35   return events;
36 }
37 
TEST(ProfileBufferTest,Empty)38 TEST(ProfileBufferTest, Empty) {
39   ProfileBuffer buffer(/*max_size*/ 0, /*enabled*/ true);
40   EXPECT_EQ(0, buffer.Size());
41 }
42 
TEST(ProfileBufferTest,AddEvent)43 TEST(ProfileBufferTest, AddEvent) {
44   ProfileBuffer buffer(/*max_size*/ 10, /*enabled*/ true);
45   EXPECT_EQ(0, buffer.Size());
46   auto event_handle =
47       buffer.BeginEvent("hello", ProfileEvent::EventType::DEFAULT,
48                         /*event_metadata1*/ 42, /*event_metadata2*/ 0);
49 
50   EXPECT_GE(event_handle, 0);
51   EXPECT_EQ(1, buffer.Size());
52 
53   auto event = GetProfileEvents(buffer)[0];
54   EXPECT_EQ(event->tag, "hello");
55   EXPECT_GT(event->begin_timestamp_us, 0);
56   EXPECT_EQ(event->event_type, ProfileEvent::EventType::DEFAULT);
57   EXPECT_EQ(event->event_metadata, 42);
58 
59   buffer.EndEvent(event_handle);
60   EXPECT_EQ(1, buffer.Size());
61   EXPECT_GE(event->elapsed_time, 0);
62 }
63 
TEST(ProfileBufferTest,EndEventWithMetadata)64 TEST(ProfileBufferTest, EndEventWithMetadata) {
65   ProfileBuffer buffer(/*max_size*/ 10, /*enabled*/ true);
66   EXPECT_EQ(0, buffer.Size());
67   auto event_handle =
68       buffer.BeginEvent("hello", ProfileEvent::EventType::DEFAULT,
69                         /*event_metadata1*/ 42, /*event_metadata2*/ 0);
70   const int64_t kEventMetadata1 = 18;
71   const int64_t kEventMetadata2 = 36;
72   buffer.EndEvent(event_handle, &kEventMetadata1, &kEventMetadata2);
73 
74   EXPECT_GE(event_handle, 0);
75   EXPECT_EQ(1, buffer.Size());
76   auto event = GetProfileEvents(buffer)[0];
77   EXPECT_EQ(event->tag, "hello");
78   EXPECT_GT(event->begin_timestamp_us, 0);
79   EXPECT_EQ(event->event_type, ProfileEvent::EventType::DEFAULT);
80   EXPECT_EQ(event->event_metadata, kEventMetadata1);
81   EXPECT_EQ(event->extra_event_metadata, kEventMetadata2);
82   EXPECT_EQ(1, buffer.Size());
83   EXPECT_GE(event->elapsed_time, 0);
84 }
85 
TEST(ProfileBufferTest,OverFlow)86 TEST(ProfileBufferTest, OverFlow) {
87   const int max_size = 4;
88   ProfileBuffer buffer{max_size, true};
89   std::vector<std::string> eventNames = {"first", "second", "third", "fourth"};
90   for (int i = 0; i < 2 * max_size; i++) {
91     buffer.BeginEvent(eventNames[i % 4].c_str(),
92                       ProfileEvent::EventType::DEFAULT, i, 0);
93     size_t expected_size = std::min(i + 1, max_size);
94     EXPECT_EQ(expected_size, buffer.Size());
95   }
96   EXPECT_EQ(max_size, buffer.Size());
97   for (size_t j = 0; j < buffer.Size(); ++j) {
98     auto event = buffer.At(j);
99     EXPECT_EQ(eventNames[j % 4], event->tag);
100     EXPECT_EQ(ProfileEvent::EventType::DEFAULT, event->event_type);
101     EXPECT_EQ(j, event->event_metadata);
102   }
103 }
104 
TEST(ProfileBufferTest,DynamicIncrease)105 TEST(ProfileBufferTest, DynamicIncrease) {
106   const int max_initial_size = 4;
107   ProfileBuffer buffer{max_initial_size, true,
108                        true /*allow_dynamic_buffer_increase*/};
109   std::vector<std::string> eventNames = {"first", "second", "third", "fourth"};
110   for (int i = 0; i < 2 * max_initial_size; i++) {
111     buffer.BeginEvent(eventNames[i % 4].c_str(),
112                       ProfileEvent::EventType::DEFAULT, i, 0);
113     const size_t expected_size = i + 1;
114     EXPECT_EQ(expected_size, buffer.Size());
115   }
116   EXPECT_EQ(2 * max_initial_size, buffer.Size());
117   for (size_t j = 0; j < buffer.Size(); ++j) {
118     auto event = buffer.At(j);
119     EXPECT_EQ(eventNames[j % 4], event->tag);
120     EXPECT_EQ(ProfileEvent::EventType::DEFAULT, event->event_type);
121     EXPECT_EQ(j, event->event_metadata);
122   }
123 }
124 
TEST(ProfileBufferTest,Enable)125 TEST(ProfileBufferTest, Enable) {
126   ProfileBuffer buffer(/*max_size*/ 10, /*enabled*/ false);
127   EXPECT_EQ(0, buffer.Size());
128   auto event_handle =
129       buffer.BeginEvent("hello", ProfileEvent::EventType::DEFAULT,
130                         /*event_metadata1*/ 42, /*event_metadata2*/ 0);
131   EXPECT_EQ(kInvalidEventHandle, event_handle);
132   EXPECT_EQ(0, buffer.Size());
133   buffer.SetEnabled(true);
134   event_handle =
135       buffer.BeginEvent("hello", ProfileEvent::EventType::DEFAULT,
136                         /*event_metadata1*/ 42, /*event_metadata2*/ 0);
137   EXPECT_GE(event_handle, 0);
138   EXPECT_EQ(1, buffer.Size());
139 }
140 
141 }  // namespace
142 }  // namespace profiling
143 }  // namespace tflite
144