9 char const *
const kOperationNames[] = {
21 "readPrefetchToCache",
35 tbb::concurrent_unordered_map<std::string, int> s_nameToToken;
36 std::atomic<int> s_nextTokenValue{0};
54 return kOperationNames[
static_cast<int>(operation)];
58 auto itFound = s_nameToToken.find(iName);
59 if( itFound != s_nameToToken.end()) {
62 int value = s_nextTokenValue++;
64 auto ret = s_nameToToken.insert(std::make_pair(iName, value));
71 for(
auto it = s_nameToToken.begin(), itEnd = s_nameToToken.end(); it != itEnd; ++it) {
72 if (it->second == iToken.
value()) {
83 std::ostringstream os;
85 os <<
"stats: class/operation/attempts/successes/amount/time-total/time-min/time-max\n";
86 for (
auto i = s_nameToToken.begin ();
i != s_nameToToken.end(); ++
i) {
87 auto const& opStats =
m_stats[
i->second];
88 for (
auto j = opStats.begin ();
j != opStats.end (); ++
j, first =
false)
89 os << (first ?
"" :
"; ")
91 << kOperationNames[
j->first] <<
'='
92 <<
j->second.attempts <<
'/'
93 <<
j->second.successes <<
'/'
94 << (static_cast<double>(
j->second.amount) / 1024 / 1024) <<
"MB/"
95 << (static_cast<double>(
j->second.timeTotal) / 1000 / 1000) <<
"ms/"
96 << (static_cast<double>(
j->second.timeMin) / 1000 / 1000) <<
"ms/"
97 << (static_cast<double>(
j->second.timeMax) / 1000 / 1000) <<
"ms";
104 int const oneM = 1000 * 1000;
105 int const oneMeg = 1024 * 1024;
106 for (
auto i = s_nameToToken.begin ();
i != s_nameToToken.end(); ++
i) {
107 auto const& opStats =
m_stats[
i->second];
108 for (
auto j = opStats.begin();
j != opStats.end(); ++
j) {
109 std::ostringstream os;
110 os <<
"Timing-" <<
i->first <<
"-" << kOperationNames[
j->first] <<
"-";
111 summary.insert(std::make_pair(os.str() +
"numOperations",
i2str(
j->second.attempts)));
112 summary.insert(std::make_pair(os.str() +
"numSuccessfulOperations",
i2str(
j->second.successes)));
113 summary.insert(std::make_pair(os.str() +
"totalMegabytes",
d2str(static_cast<double>(
j->second.amount) / oneMeg)));
114 summary.insert(std::make_pair(os.str() +
"totalMsecs",
d2str(static_cast<double>(
j->second.timeTotal) / oneM)));
115 summary.insert(std::make_pair(os.str() +
"minMsecs",
d2str(static_cast<double>(
j->second.timeMin) / oneM)));
116 summary.insert(std::make_pair(os.str() +
"maxMsecs",
d2str(static_cast<double>(
j->second.timeMax) / oneM)));
129 return opstats[
static_cast<int>(operation)];
133 : m_counter (counter),
134 m_start (std::chrono::high_resolution_clock::
now())
143 uint64_t elapsed = elapsed_ns.count();
144 m_counter.successes++;
146 m_counter.vector_count +=
count;
147 m_counter.vector_square += count*
count;
148 m_counter.amount += amount;
152 if (elapsed < m_counter.timeMin || m_counter.successes == 1)
153 m_counter.timeMin = elapsed;
154 if (elapsed > m_counter.timeMax)
155 m_counter.timeMax = elapsed;
tuple ret
prodAgent to be discontinued
static StorageStats m_stats
static void fillSummary(std::map< std::string, std::string > &summary)
static char const * operationName(Operation operation)
static const StorageStats & summary(void)
std::atomic< uint64_t > attempts
static std::string d2str(double d)
tbb::concurrent_unordered_map< int, OperationStats > StorageStats
static StorageClassToken tokenForStorageClassName(std::string const &iName)
static void addTo(std::atomic< double > &iAtomic, double iToAdd)
static const std::string & nameForToken(StorageClassToken)
static std::string i2str(int i)
static Counter & counter(StorageClassToken token, Operation operation)
unsigned long long uint64_t
void tick(uint64_t amount=0, int64_t tick=0) const
static std::atomic< unsigned int > counter
static std::string summaryText(bool banner=false)
boost::date_time::subsecond_duration< boost::posix_time::time_duration, 1000000000 > nanoseconds