From: Adam Simpkins Date: Wed, 17 Apr 2013 03:41:29 +0000 (-0700) Subject: move rateHelper() to detail/Stats.h X-Git-Tag: v0.22.0~996 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=26b90449dd62f5d9d33c697799892eb203c21b51 move rateHelper() to detail/Stats.h Summary: The BucketedTimeSeries::rateHelper() function is generic, and not specific to the BucketedTimeSeries class. This diff moves it to folly/detail/Stats.h, so other parts of the stats code can access it as well. Test Plan: Ran the folly unit tests. Reviewed By: delong.j@fb.com FB internal diff: D778115 --- diff --git a/folly/detail/Stats.h b/folly/detail/Stats.h index 3e5ef06f..4729eeed 100644 --- a/folly/detail/Stats.h +++ b/folly/detail/Stats.h @@ -17,6 +17,7 @@ #ifndef FOLLY_DETAIL_STATS_H_ #define FOLLY_DETAIL_STATS_H_ +#include #include #include @@ -49,6 +50,36 @@ avgHelper(ValueType sum, uint64_t count) { return static_cast(sumf / countf); } +/* + * Helper function to compute the rate per Interval, + * given the specified count recorded over the elapsed time period. + */ +template +ReturnType rateHelper(ReturnType count, TimeType elapsed) { + if (elapsed == TimeType(0)) { + return 0; + } + + // Use std::chrono::duration_cast to convert between the native + // duration and the desired interval. However, convert the rates, + // rather than just converting the elapsed duration. Converting the + // elapsed time first may collapse it down to 0 if the elapsed interval + // is less than the desired interval, which will incorrectly result in + // an infinite rate. + typedef std::chrono::duration< + ReturnType, std::ratio> NativeRate; + typedef std::chrono::duration< + ReturnType, std::ratio> DesiredRate; + + NativeRate native(count / elapsed.count()); + DesiredRate desired = std::chrono::duration_cast(native); + return desired.count(); +} + template struct Bucket { diff --git a/folly/stats/BucketedTimeSeries.h b/folly/stats/BucketedTimeSeries.h index 1c8a4ab0..22d8421d 100644 --- a/folly/stats/BucketedTimeSeries.h +++ b/folly/stats/BucketedTimeSeries.h @@ -372,26 +372,8 @@ class BucketedTimeSeries { private: template ReturnType rateHelper(ReturnType numerator, TimeType elapsed) const { - if (elapsed == TimeType(0)) { - return 0; - } - - // Use std::chrono::duration_cast to convert between the native - // duration and the desired interval. However, convert the rates, - // rather than just converting the elapsed duration. Converting the - // elapsed time first may collapse it down to 0 if the elapsed interval - // is less than the desired interval, which will incorrectly result in - // an infinite rate. - typedef std::chrono::duration< - ReturnType, std::ratio> NativeRate; - typedef std::chrono::duration< - ReturnType, std::ratio> DesiredRate; - - NativeRate native(numerator / elapsed.count()); - DesiredRate desired = std::chrono::duration_cast(native); - return desired.count(); + return detail::rateHelper(numerator, + elapsed); } ValueType rangeAdjust(TimeType bucketStart, TimeType nextBucketStart,