X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FBenchmark.cpp;h=6259970872fe7ad26370672be7b2d95cb3546359;hb=46e3ed2921bd4e5de81fbc36fcb6a82d30d1499f;hp=2fb3515269b0d301db8c5a2e9b25b0c321e2e43f;hpb=edf5a373cd47666cf9554ae4fe21c3d8d7d89ac0;p=folly.git diff --git a/folly/Benchmark.cpp b/folly/Benchmark.cpp index 2fb35152..62599708 100644 --- a/folly/Benchmark.cpp +++ b/folly/Benchmark.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2014 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -51,12 +51,16 @@ namespace folly { BenchmarkSuspender::NanosecondsSpent BenchmarkSuspender::nsSpent; -typedef function BenchmarkFun; +typedef function BenchmarkFun; static vector> benchmarks; // Add the global baseline BENCHMARK(globalBenchmarkBaseline) { +#ifdef _MSC_VER + _ReadWriteBarrier(); +#else asm volatile(""); +#endif } void detail::addBenchmarkImpl(const char* file, const char* name, @@ -210,8 +214,8 @@ static double runBenchmarkGetNSPerIteration(const BenchmarkFun& fun, // the clock resolution is worse than that, it will be larger. In // essence we're aiming at making the quantization noise 0.01%. static const auto minNanoseconds = - max(FLAGS_bm_min_usec * 1000UL, - min(resolutionInNs * 100000, 1000000000ULL)); + max(FLAGS_bm_min_usec * 1000UL, + min(resolutionInNs * 100000, 1000000000ULL)); // We do measurements in several epochs and take the minimum, to // account for jitter. @@ -227,13 +231,14 @@ static double runBenchmarkGetNSPerIteration(const BenchmarkFun& fun, for (; actualEpochs < epochs; ++actualEpochs) { for (unsigned int n = FLAGS_bm_min_iters; n < (1UL << 30); n *= 2) { - auto const nsecs = fun(n); - if (nsecs < minNanoseconds) { + auto const nsecsAndIter = fun(n); + if (nsecsAndIter.first < minNanoseconds) { continue; } // We got an accurate enough timing, done. But only save if // smaller than the current result. - epochResults[actualEpochs] = max(0.0, double(nsecs) / n - globalBaseline); + epochResults[actualEpochs] = max(0.0, double(nsecsAndIter.first) / + nsecsAndIter.second - globalBaseline); // Done with the current epoch, we got a meaningful timing. break; } @@ -267,7 +272,7 @@ static const ScaleInfo kTimeSuffixes[] { { 1E-9, "ns" }, { 1E-12, "ps" }, { 1E-15, "fs" }, - { 0, NULL }, + { 0, nullptr }, }; static const ScaleInfo kMetricSuffixes[] { @@ -289,7 +294,7 @@ static const ScaleInfo kMetricSuffixes[] { { 1E-18, "a" }, // atto { 1E-21, "z" }, // zepto { 1E-24, "y" }, // yocto - { 0, NULL }, + { 0, nullptr }, }; static string humanReadable(double n, unsigned int decimals, @@ -300,7 +305,7 @@ static string humanReadable(double n, unsigned int decimals, const double absValue = fabs(n); const ScaleInfo* scale = scales; - while (absValue < scale[0].boundary && scale[1].suffix != NULL) { + while (absValue < scale[0].boundary && scale[1].suffix != nullptr) { ++scale; } @@ -319,7 +324,7 @@ static string metricReadable(double n, unsigned int decimals) { static void printBenchmarkResultsAsTable( const vector >& data) { // Width available - static const uint columns = 76; + static const unsigned int columns = 76; // Compute the longest benchmark name size_t longestName = 0; @@ -424,7 +429,7 @@ void runBenchmarks() { get<2>(benchmarks.front()), 0); FOR_EACH_RANGE (i, 1, benchmarks.size()) { double elapsed = 0.0; - if (!strcmp(get<1>(benchmarks[i]), "-") == 0) { // skip separators + if (strcmp(get<1>(benchmarks[i]), "-") != 0) { // skip separators if (bmRegex && !boost::regex_search(get<1>(benchmarks[i]), *bmRegex)) { continue; }