1*c6aa206bSSiva Chandra Reddy //===-- Timer.cpp --------------------------------------------------------===//
2*c6aa206bSSiva Chandra Reddy //
3*c6aa206bSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*c6aa206bSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5*c6aa206bSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*c6aa206bSSiva Chandra Reddy //
7*c6aa206bSSiva Chandra Reddy //===----------------------------------------------------------------------===//
8*c6aa206bSSiva Chandra Reddy 
9*c6aa206bSSiva Chandra Reddy #include "Timer.h"
10*c6aa206bSSiva Chandra Reddy 
11*c6aa206bSSiva Chandra Reddy #include <chrono>
12*c6aa206bSSiva Chandra Reddy #include <fstream>
13*c6aa206bSSiva Chandra Reddy 
14*c6aa206bSSiva Chandra Reddy namespace __llvm_libc {
15*c6aa206bSSiva Chandra Reddy namespace testing {
16*c6aa206bSSiva Chandra Reddy 
17*c6aa206bSSiva Chandra Reddy struct TimerImplementation {
18*c6aa206bSSiva Chandra Reddy   std::chrono::high_resolution_clock::time_point Start;
19*c6aa206bSSiva Chandra Reddy   std::chrono::high_resolution_clock::time_point End;
20*c6aa206bSSiva Chandra Reddy };
21*c6aa206bSSiva Chandra Reddy 
Timer()22*c6aa206bSSiva Chandra Reddy Timer::Timer() : Impl(new TimerImplementation) {}
23*c6aa206bSSiva Chandra Reddy 
~Timer()24*c6aa206bSSiva Chandra Reddy Timer::~Timer() { delete reinterpret_cast<TimerImplementation *>(Impl); }
25*c6aa206bSSiva Chandra Reddy 
start()26*c6aa206bSSiva Chandra Reddy void Timer::start() {
27*c6aa206bSSiva Chandra Reddy   auto T = reinterpret_cast<TimerImplementation *>(Impl);
28*c6aa206bSSiva Chandra Reddy   T->Start = std::chrono::high_resolution_clock::now();
29*c6aa206bSSiva Chandra Reddy }
30*c6aa206bSSiva Chandra Reddy 
stop()31*c6aa206bSSiva Chandra Reddy void Timer::stop() {
32*c6aa206bSSiva Chandra Reddy   auto T = reinterpret_cast<TimerImplementation *>(Impl);
33*c6aa206bSSiva Chandra Reddy   T->End = std::chrono::high_resolution_clock::now();
34*c6aa206bSSiva Chandra Reddy }
35*c6aa206bSSiva Chandra Reddy 
nanoseconds() const36*c6aa206bSSiva Chandra Reddy uint64_t Timer::nanoseconds() const {
37*c6aa206bSSiva Chandra Reddy   auto T = reinterpret_cast<TimerImplementation *>(Impl);
38*c6aa206bSSiva Chandra Reddy   return std::chrono::nanoseconds(T->End - T->Start).count();
39*c6aa206bSSiva Chandra Reddy }
40*c6aa206bSSiva Chandra Reddy 
41*c6aa206bSSiva Chandra Reddy } // namespace testing
42*c6aa206bSSiva Chandra Reddy } // namespace __llvm_libc
43