Unreviewed, rolling out r234489.
[WebKit-https.git] / Source / WTF / wtf / SimpleStats.h
1 /*
2  * Copyright (C) 2012, 2016 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 #ifndef SimpleStats_h
27 #define SimpleStats_h
28
29 #include <wtf/MathExtras.h>
30 #include <wtf/StdLibExtras.h>
31
32 namespace WTF {
33
34 // Simple and cheap way of tracking statistics if you're not worried about chopping on
35 // the sum of squares (i.e. the sum of squares is unlikely to exceed 2^52).
36 class SimpleStats {
37     WTF_MAKE_FAST_ALLOCATED;
38 public:
39     SimpleStats()
40         : m_count(0)
41         , m_sum(0)
42         , m_sumOfSquares(0)
43     {
44     }
45     
46     void add(double value)
47     {
48         m_count++;
49         m_sum += value;
50         m_sumOfSquares += value * value;
51     }
52     
53     explicit operator bool() const
54     {
55         return !!m_count;
56     }
57     
58     double count() const
59     {
60         return m_count;
61     }
62     
63     double sum() const
64     {
65         return m_sum;
66     }
67     
68     double sumOfSquares() const
69     {
70         return m_sumOfSquares;
71     }
72     
73     double mean() const
74     {
75         return m_sum / m_count;
76     }
77     
78     // NB. This gives a biased variance as it divides by the number of samples rather
79     // than the degrees of freedom. This is fine once the count grows large, which in
80     // our case will happen rather quickly.
81     double variance() const
82     {
83         if (m_count < 2)
84             return 0;
85         
86         // Compute <x^2> - <x>^2
87         double secondMoment = m_sumOfSquares / m_count;
88         double firstMoment = m_sum / m_count;
89         
90         double result = secondMoment - firstMoment * firstMoment;
91         
92         // It's possible to get -epsilon. Protect against this and turn it into
93         // +0.
94         if (result <= 0)
95             return 0;
96         
97         return result;
98     }
99     
100     // NB. This gives a biased standard deviation. See above.
101     double standardDeviation() const
102     {
103         return sqrt(variance());
104     }
105     
106 private:
107     double m_count;
108     double m_sum;
109     double m_sumOfSquares;
110 };
111
112 } // namespace WTF
113
114 using WTF::SimpleStats;
115
116 #endif // SimpleStats_h
117