X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FTimer.cpp;h=077995d9fb8993a21d4a07120d20e1c366b0854a;hb=3daae2701b76293c31c1cbdafc9782352321e1f0;hp=4b273b02ff9184f3333840ff697189dc3783961f;hpb=aeb47b8db9246fc0d5d6e437225fe84524da9202;p=oota-llvm.git diff --git a/lib/Support/Timer.cpp b/lib/Support/Timer.cpp index 4b273b02ff9..077995d9fb8 100644 --- a/lib/Support/Timer.cpp +++ b/lib/Support/Timer.cpp @@ -1,10 +1,10 @@ //===-- Timer.cpp - Interval Timing Support -------------------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // Interval Timing implementation. @@ -13,13 +13,13 @@ #include "llvm/Support/Timer.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Streams.h" #include "llvm/System/Process.h" #include #include #include -#include #include - using namespace llvm; // GetLibSupportInfoOutputFile - Return a file stream to print our output on. @@ -27,14 +27,14 @@ namespace llvm { extern std::ostream *GetLibSupportInfoOutputFile(); } // getLibSupportInfoOutputFilename - This ugly hack is brought to you courtesy // of constructor/destructor ordering being unspecified by C++. Basically the -// problem is that a Statistic<> object gets destroyed, which ends up calling +// problem is that a Statistic object gets destroyed, which ends up calling // 'GetLibSupportInfoOutputFile()' (below), which calls this function. // LibSupportInfoOutputFilename used to be a global variable, but sometimes it // would get destroyed before the Statistic, causing havoc to ensue. We "fix" // this by creating the string the first time it is needed and never destroying // it. +static ManagedStatic LibSupportInfoOutputFilename; static std::string &getLibSupportInfoOutputFilename() { - static std::string *LibSupportInfoOutputFilename = new std::string(); return *LibSupportInfoOutputFilename; } @@ -93,7 +93,7 @@ Timer::~Timer() { } } -static inline long getMemUsage() { +static inline size_t getMemUsage() { if (TrackSpace) return sys::Process::GetMallocUsage(); return 0; @@ -101,7 +101,7 @@ static inline long getMemUsage() { struct TimeRecord { double Elapsed, UserTime, SystemTime; - long MemUsed; + ssize_t MemUsed; }; static TimeRecord getTimeRecord(bool Start) { @@ -111,13 +111,13 @@ static TimeRecord getTimeRecord(bool Start) { sys::TimeValue user(0,0); sys::TimeValue sys(0,0); - long MemUsed = 0; + ssize_t MemUsed = 0; if (Start) { - sys::Process::GetTimeUsage(now,user,sys); MemUsed = getMemUsage(); + sys::Process::GetTimeUsage(now,user,sys); } else { - MemUsed = getMemUsage(); sys::Process::GetTimeUsage(now,user,sys); + MemUsed = getMemUsage(); } Result.Elapsed = now.seconds() + now.microseconds() / 1000000.0; @@ -128,7 +128,7 @@ static TimeRecord getTimeRecord(bool Start) { return Result; } -static std::vector ActiveTimers; +static ManagedStatic > ActiveTimers; void Timer::startTimer() { Started = true; @@ -138,7 +138,7 @@ void Timer::startTimer() { SystemTime -= TR.SystemTime; MemUsed -= TR.MemUsed; PeakMemBase = TR.MemUsed; - ActiveTimers.push_back(this); + ActiveTimers->push_back(this); } void Timer::stopTimer() { @@ -148,13 +148,13 @@ void Timer::stopTimer() { SystemTime += TR.SystemTime; MemUsed += TR.MemUsed; - if (ActiveTimers.back() == this) { - ActiveTimers.pop_back(); + if (ActiveTimers->back() == this) { + ActiveTimers->pop_back(); } else { std::vector::iterator I = - std::find(ActiveTimers.begin(), ActiveTimers.end(), this); - assert(I != ActiveTimers.end() && "stop but no startTimer?"); - ActiveTimers.erase(I); + std::find(ActiveTimers->begin(), ActiveTimers->end(), this); + assert(I != ActiveTimers->end() && "stop but no startTimer?"); + ActiveTimers->erase(I); } } @@ -171,10 +171,10 @@ void Timer::sum(const Timer &T) { /// currently active timers, which will be printed when the timer group prints /// void Timer::addPeakMemoryMeasurement() { - long MemUsed = getMemUsage(); + size_t MemUsed = getMemUsage(); - for (std::vector::iterator I = ActiveTimers.begin(), - E = ActiveTimers.end(); I != E; ++I) + for (std::vector::iterator I = ActiveTimers->begin(), + E = ActiveTimers->end(); I != E; ++I) (*I)->PeakMem = std::max((*I)->PeakMem, MemUsed-(*I)->PeakMemBase); } @@ -182,14 +182,14 @@ void Timer::addPeakMemoryMeasurement() { // NamedRegionTimer Implementation //===----------------------------------------------------------------------===// -static Timer &getNamedRegionTimer(const std::string &Name) { - static std::map NamedTimers; +static ManagedStatic > NamedTimers; - std::map::iterator I = NamedTimers.lower_bound(Name); - if (I != NamedTimers.end() && I->first == Name) +static Timer &getNamedRegionTimer(const std::string &Name) { + std::map::iterator I = NamedTimers->lower_bound(Name); + if (I != NamedTimers->end() && I->first == Name) return I->second; - return NamedTimers.insert(I, std::make_pair(Name, Timer(Name)))->second; + return NamedTimers->insert(I, std::make_pair(Name, Timer(Name)))->second; } NamedRegionTimer::NamedRegionTimer(const std::string &Name) @@ -239,7 +239,7 @@ void Timer::print(const Timer &Total, std::ostream &OS) { if (Total.getProcessTime()) printVal(getProcessTime(), Total.getProcessTime(), OS); printVal(Elapsed, Total.Elapsed, OS); - + OS << " "; if (Total.MemUsed) { @@ -263,17 +263,17 @@ std::ostream * llvm::GetLibSupportInfoOutputFile() { std::string &LibSupportInfoOutputFilename = getLibSupportInfoOutputFilename(); if (LibSupportInfoOutputFilename.empty()) - return &std::cerr; + return cerr.stream(); if (LibSupportInfoOutputFilename == "-") - return &std::cout; + return cout.stream(); std::ostream *Result = new std::ofstream(LibSupportInfoOutputFilename.c_str(), std::ios::app); if (!Result->good()) { - std::cerr << "Error opening info-output-file '" - << LibSupportInfoOutputFilename << " for appending!\n"; + cerr << "Error opening info-output-file '" + << LibSupportInfoOutputFilename << " for appending!\n"; delete Result; - return &std::cerr; + return cerr.stream(); } return Result; } @@ -295,20 +295,28 @@ void TimerGroup::removeTimer() { { // Scope to contain Total timer... don't allow total timer to drop us to // zero timers... Timer Total("TOTAL"); - + for (unsigned i = 0, e = TimersToPrint.size(); i != e; ++i) Total.sum(TimersToPrint[i]); - + // Print out timing header... *OutStream << "===" << std::string(73, '-') << "===\n" << std::string(Padding, ' ') << Name << "\n" << "===" << std::string(73, '-') - << "===\n Total Execution Time: "; + << "===\n"; - printAlignedFP(Total.getProcessTime(), 4, 5, *OutStream); - *OutStream << " seconds ("; - printAlignedFP(Total.getWallTime(), 4, 5, *OutStream); - *OutStream << " wall clock)\n\n"; + // If this is not an collection of ungrouped times, print the total time. + // Ungrouped timers don't really make sense to add up. We still print the + // TOTAL line to make the percentages make sense. + if (this != DefaultTimerGroup) { + *OutStream << " Total Execution Time: "; + + printAlignedFP(Total.getProcessTime(), 4, 5, *OutStream); + *OutStream << " seconds ("; + printAlignedFP(Total.getWallTime(), 4, 5, *OutStream); + *OutStream << " wall clock)\n"; + } + *OutStream << "\n"; if (Total.UserTime) *OutStream << " ---User Time---"; @@ -322,11 +330,11 @@ void TimerGroup::removeTimer() { if (Total.getPeakMem()) *OutStream << " -PeakMem-"; *OutStream << " --- Name ---\n"; - + // Loop through all of the timing data, printing it out... for (unsigned i = 0, e = TimersToPrint.size(); i != e; ++i) TimersToPrint[i].print(Total, *OutStream); - + Total.print(Total, *OutStream); *OutStream << std::endl; // Flush output } @@ -334,7 +342,7 @@ void TimerGroup::removeTimer() { TimersToPrint.clear(); - if (OutStream != &std::cerr && OutStream != &std::cout) + if (OutStream != cerr.stream() && OutStream != cout.stream()) delete OutStream; // Close the file... }