blob: 4aa323a42e97568d29bf15a5d452bf6b688516f3 [file] [log] [blame]
// Copyright 2021 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef STARBOARD_NPLB_PERFORMANCE_HELPERS_H_
#define STARBOARD_NPLB_PERFORMANCE_HELPERS_H_
#include "starboard/common/time.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
namespace nplb {
// Default for parameter |count_calls| of TestPerformanceOfFunction.
constexpr int kDefaultTestPerformanceCountCalls = 1000;
// Default for parameter |max_time_per_call| of TestPerformanceOfFunction.
constexpr int64_t kDefaultTestPerformanceMaxTimePerCall = 500; // 0.5ms
// Helper function for testing function call time performance.
template <const size_t count_calls,
const int64_t max_time_per_call,
typename R,
typename... Args>
void TestPerformanceOfFunction(const char* const name_of_f,
R (*const f)(Args...),
Args... args) {
// Measure time pre calls to |f|.
const int64_t time_start = CurrentMonotonicTime();
SbLogPriority initial_log_level = starboard::logging::GetMinLogLevel();
starboard::logging::SetMinLogLevel(kSbLogPriorityFatal);
// Call |f| |count_calls| times.
for (int i = 0; i < count_calls; ++i) {
f(args...);
}
starboard::logging::SetMinLogLevel(initial_log_level);
// Measure time post calls to |f|.
const int64_t time_last = CurrentMonotonicTime();
const int64_t time_delta = time_last - time_start;
const double time_per_call = static_cast<double>(time_delta) / count_calls;
// Pretty printing.
SB_LOG(INFO) << "TestPerformanceOfFunction - " << name_of_f;
SB_LOG(INFO) << " Measured duration " << time_delta << "us total across "
<< count_calls << " calls.";
SB_LOG(INFO) << " Measured duration " << time_per_call
<< "us average per call.";
// Compare |time_delta| to |max_time_delta|.
// Using the aggregate time avoids loss of precision at the us range.
const int64_t max_time_delta = max_time_per_call * count_calls;
EXPECT_LT(time_delta, max_time_delta);
}
// The following macros should be preferred over direct calls to
// TestPerformanceOfFunction to assure consistency between |name_of_f| and |f|.
// Note: TEST_PERF_FUNCWITHARGS_xxx and TEST_PERF_FUNCNOARGS_xxx variants exist
// to accommodate proper variadic parameter passing from macros to templates.
// TEST_PERF_FUNCNOARGS_EXPLICIT: No args to |f|, explicit test args.
#define TEST_PERF_FUNCNOARGS_EXPLICIT(C, T, name) \
TestPerformanceOfFunction<C, T>(#name, &name)
// TEST_PERF_FUNCNOARGS_EXPLICIT: No args to |f|, default test args.
#define TEST_PERF_FUNCNOARGS_DEFAULT(name) \
TEST_PERF_FUNCNOARGS_EXPLICIT(kDefaultTestPerformanceCountCalls, \
kDefaultTestPerformanceMaxTimePerCall, name)
// TEST_PERF_FUNCWITHARGS_EXPLICIT: Variadic args to |f|, explicit test args.
#define TEST_PERF_FUNCWITHARGS_EXPLICIT(C, T, name, ...) \
TestPerformanceOfFunction<C, T>(#name, &name, __VA_ARGS__)
// TEST_PERF_FUNCWITHARGS_DEFAULT: Variadic args to |f|, default test args.
#define TEST_PERF_FUNCWITHARGS_DEFAULT(name, ...) \
TEST_PERF_FUNCWITHARGS_EXPLICIT(kDefaultTestPerformanceCountCalls, \
kDefaultTestPerformanceMaxTimePerCall, name, \
__VA_ARGS__)
} // namespace nplb
} // namespace starboard
#endif // STARBOARD_NPLB_PERFORMANCE_HELPERS_H_