| //===- Timing.cpp - Execution time measurement facilities -----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Facilities to measure and provide statistics on execution time. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "flang/Support/Timing.h" |
| #include "llvm/Support/Format.h" |
| |
| class OutputStrategyText : public mlir::OutputStrategy { |
| protected: |
| static constexpr llvm::StringLiteral header = "Flang execution timing report"; |
| |
| public: |
| OutputStrategyText(llvm::raw_ostream &os) : mlir::OutputStrategy(os) {} |
| |
| void printHeader(const mlir::TimeRecord &total) override { |
| // Figure out how many spaces to description name. |
| unsigned padding = (80 - header.size()) / 2; |
| os << "===" << std::string(73, '-') << "===\n"; |
| os.indent(padding) << header << '\n'; |
| os << "===" << std::string(73, '-') << "===\n"; |
| |
| // Print the total time followed by the section headers. |
| os << llvm::format(" Total Execution Time: %.4f seconds\n\n", total.wall); |
| os << " ----User Time---- ----Wall Time---- ----Name----\n"; |
| } |
| |
| void printFooter() override { os.flush(); } |
| |
| void printTime( |
| const mlir::TimeRecord &time, const mlir::TimeRecord &total) override { |
| os << llvm::format( |
| " %8.4f (%5.1f%%)", time.user, 100.0 * time.user / total.user); |
| os << llvm::format( |
| " %8.4f (%5.1f%%) ", time.wall, 100.0 * time.wall / total.wall); |
| } |
| |
| void printListEntry(llvm::StringRef name, const mlir::TimeRecord &time, |
| const mlir::TimeRecord &total, bool lastEntry) override { |
| printTime(time, total); |
| os << name << "\n"; |
| } |
| |
| void printTreeEntry(unsigned indent, llvm::StringRef name, |
| const mlir::TimeRecord &time, const mlir::TimeRecord &total) override { |
| printTime(time, total); |
| os.indent(indent) << name << "\n"; |
| } |
| |
| void printTreeEntryEnd(unsigned indent, bool lastEntry) override {} |
| }; |
| |
| namespace Fortran::support { |
| |
| std::unique_ptr<mlir::OutputStrategy> createTimingFormatterText( |
| llvm::raw_ostream &os) { |
| return std::make_unique<OutputStrategyText>(os); |
| } |
| |
| } // namespace Fortran::support |