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