xref: /llvm-project/flang/lib/Support/Timing.cpp (revision 310c281b020b169e760ca75f878f5873ffbb2a9f)
1*310c281bSmacurtis-amd //===- Timing.cpp - Execution time measurement facilities -----------------===//
2*310c281bSmacurtis-amd //
3*310c281bSmacurtis-amd // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*310c281bSmacurtis-amd // See https://llvm.org/LICENSE.txt for license information.
5*310c281bSmacurtis-amd // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*310c281bSmacurtis-amd //
7*310c281bSmacurtis-amd //===----------------------------------------------------------------------===//
8*310c281bSmacurtis-amd //
9*310c281bSmacurtis-amd // Facilities to measure and provide statistics on execution time.
10*310c281bSmacurtis-amd //
11*310c281bSmacurtis-amd //===----------------------------------------------------------------------===//
12*310c281bSmacurtis-amd 
13*310c281bSmacurtis-amd #include "flang/Support/Timing.h"
14*310c281bSmacurtis-amd #include "llvm/Support/Format.h"
15*310c281bSmacurtis-amd 
16*310c281bSmacurtis-amd class OutputStrategyText : public mlir::OutputStrategy {
17*310c281bSmacurtis-amd protected:
18*310c281bSmacurtis-amd   static constexpr llvm::StringLiteral header = "Flang execution timing report";
19*310c281bSmacurtis-amd 
20*310c281bSmacurtis-amd public:
21*310c281bSmacurtis-amd   OutputStrategyText(llvm::raw_ostream &os) : mlir::OutputStrategy(os) {}
22*310c281bSmacurtis-amd 
23*310c281bSmacurtis-amd   void printHeader(const mlir::TimeRecord &total) override {
24*310c281bSmacurtis-amd     // Figure out how many spaces to description name.
25*310c281bSmacurtis-amd     unsigned padding = (80 - header.size()) / 2;
26*310c281bSmacurtis-amd     os << "===" << std::string(73, '-') << "===\n";
27*310c281bSmacurtis-amd     os.indent(padding) << header << '\n';
28*310c281bSmacurtis-amd     os << "===" << std::string(73, '-') << "===\n";
29*310c281bSmacurtis-amd 
30*310c281bSmacurtis-amd     // Print the total time followed by the section headers.
31*310c281bSmacurtis-amd     os << llvm::format("  Total Execution Time: %.4f seconds\n\n", total.wall);
32*310c281bSmacurtis-amd     os << "  ----User Time----  ----Wall Time----  ----Name----\n";
33*310c281bSmacurtis-amd   }
34*310c281bSmacurtis-amd 
35*310c281bSmacurtis-amd   void printFooter() override { os.flush(); }
36*310c281bSmacurtis-amd 
37*310c281bSmacurtis-amd   void printTime(
38*310c281bSmacurtis-amd       const mlir::TimeRecord &time, const mlir::TimeRecord &total) override {
39*310c281bSmacurtis-amd     os << llvm::format(
40*310c281bSmacurtis-amd         "  %8.4f (%5.1f%%)", time.user, 100.0 * time.user / total.user);
41*310c281bSmacurtis-amd     os << llvm::format(
42*310c281bSmacurtis-amd         "  %8.4f (%5.1f%%)  ", time.wall, 100.0 * time.wall / total.wall);
43*310c281bSmacurtis-amd   }
44*310c281bSmacurtis-amd 
45*310c281bSmacurtis-amd   void printListEntry(llvm::StringRef name, const mlir::TimeRecord &time,
46*310c281bSmacurtis-amd       const mlir::TimeRecord &total, bool lastEntry) override {
47*310c281bSmacurtis-amd     printTime(time, total);
48*310c281bSmacurtis-amd     os << name << "\n";
49*310c281bSmacurtis-amd   }
50*310c281bSmacurtis-amd 
51*310c281bSmacurtis-amd   void printTreeEntry(unsigned indent, llvm::StringRef name,
52*310c281bSmacurtis-amd       const mlir::TimeRecord &time, const mlir::TimeRecord &total) override {
53*310c281bSmacurtis-amd     printTime(time, total);
54*310c281bSmacurtis-amd     os.indent(indent) << name << "\n";
55*310c281bSmacurtis-amd   }
56*310c281bSmacurtis-amd 
57*310c281bSmacurtis-amd   void printTreeEntryEnd(unsigned indent, bool lastEntry) override {}
58*310c281bSmacurtis-amd };
59*310c281bSmacurtis-amd 
60*310c281bSmacurtis-amd namespace Fortran::support {
61*310c281bSmacurtis-amd 
62*310c281bSmacurtis-amd std::unique_ptr<mlir::OutputStrategy> createTimingFormatterText(
63*310c281bSmacurtis-amd     llvm::raw_ostream &os) {
64*310c281bSmacurtis-amd   return std::make_unique<OutputStrategyText>(os);
65*310c281bSmacurtis-amd }
66*310c281bSmacurtis-amd 
67*310c281bSmacurtis-amd } // namespace Fortran::support
68