/ tools / CompilerTimingScope.cpp
CompilerTimingScope.cpp
  1  /*
  2   * Copyright (C) 2015-2018 Apple Inc. All rights reserved.
  3   *
  4   * Redistribution and use in source and binary forms, with or without
  5   * modification, are permitted provided that the following conditions
  6   * are met:
  7   * 1. Redistributions of source code must retain the above copyright
  8   *    notice, this list of conditions and the following disclaimer.
  9   * 2. Redistributions in binary form must reproduce the above copyright
 10   *    notice, this list of conditions and the following disclaimer in the
 11   *    documentation and/or other materials provided with the distribution.
 12   *
 13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 14   * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 17   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21   * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24   */
 25  
 26  #include "config.h"
 27  #include "CompilerTimingScope.h"
 28  
 29  #include "Options.h"
 30  #include <wtf/DataLog.h>
 31  #include <wtf/Lock.h>
 32  #include <wtf/Vector.h>
 33  #include <wtf/text/WTFString.h>
 34  
 35  namespace JSC {
 36  
 37  namespace {
 38  
 39  class CompilerTimingScopeState {
 40      WTF_MAKE_NONCOPYABLE(CompilerTimingScopeState);
 41      WTF_MAKE_FAST_ALLOCATED;
 42  public:
 43      CompilerTimingScopeState() { }
 44      
 45      Seconds addToTotal(const char* compilerName, const char* name, Seconds duration)
 46      {
 47          auto locker = holdLock(lock);
 48  
 49          for (auto& tuple : totals) {
 50              if (String(std::get<0>(tuple)) == String(compilerName) && String(std::get<1>(tuple)) == String(name)) {
 51                  std::get<2>(tuple) += duration;
 52                  return std::get<2>(tuple);
 53              }
 54          }
 55  
 56          totals.append({ compilerName, name, duration });
 57          return duration;
 58      }
 59  
 60      void logTotals()
 61      {
 62          for (auto& tuple : totals) {
 63              dataLogLn(
 64                  "[", std::get<0>(tuple), "] ", std::get<1>(tuple), " total ms: ", std::get<2>(tuple).milliseconds());
 65          }
 66      }
 67      
 68  private:
 69      Vector<std::tuple<const char*, const char*, Seconds>> totals;
 70      Lock lock;
 71  };
 72  
 73  CompilerTimingScopeState& compilerTimingScopeState()
 74  {
 75      static Atomic<CompilerTimingScopeState*> s_state;
 76      return ensurePointer(s_state, [] { return new CompilerTimingScopeState(); });
 77  }
 78  
 79  } // anonymous namespace
 80  
 81  CompilerTimingScope::CompilerTimingScope(const char* compilerName, const char* name)
 82      : m_compilerName(compilerName)
 83      , m_name(name)
 84  {
 85      if (UNLIKELY(Options::logPhaseTimes() || Options::reportTotalPhaseTimes()))
 86          m_before = MonotonicTime::now();
 87  }
 88  
 89  CompilerTimingScope::~CompilerTimingScope()
 90  {
 91      if (UNLIKELY(Options::logPhaseTimes() || Options::reportTotalPhaseTimes())) {
 92          Seconds duration = MonotonicTime::now() - m_before;
 93          auto total = compilerTimingScopeState().addToTotal(m_compilerName, m_name, duration);
 94          if (Options::logPhaseTimes()) {
 95              dataLog(
 96                  "[", m_compilerName, "] ", m_name, " took: ", duration.milliseconds(), " ms ",
 97                  "(total: ", total.milliseconds(),
 98                  " ms).\n");
 99          }
100      }
101  }
102  
103  void logTotalPhaseTimes()
104  {
105      compilerTimingScopeState().logTotals();
106  }
107  
108  } // namespace JSC