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