2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/system/common/frame-time-stats.h>
32 const float EPSILON = 0.9f; // rolling average = (average * epsilon) + (current * epsilon)
33 const float ONE_OVER_MICROSECONDS_TO_SECONDS = 1.f / 1000000.f; ///< microseconds per second
36 FrameTimeStats::FrameTimeStats()
39 mSamples.Reserve(16); // Fill out a little to avoid early reallocations
44 FrameTimeStats::~FrameTimeStats()
48 void FrameTimeStats::StartTime(const FrameTimeStamp& timeStamp)
50 // check to make sure we don't get 2 start times in a row
51 if(mTimeState != WAITING_FOR_START_TIME)
57 mTimeState = WAITING_FOR_END_TIME;
60 void FrameTimeStats::EndTime(const FrameTimeStamp& timeStamp)
62 if(mTimeState != WAITING_FOR_END_TIME)
68 mTimeState = WAITING_FOR_START_TIME;
71 // frame time in seconds
72 unsigned int elapsedTime = FrameTimeStamp::MicrosecondDiff(mStart, timeStamp);
74 mSamples.PushBack(elapsedTime);
76 // if the min and max times haven't been set, do that now.
81 mMinMaxTimeSet = true;
85 if(elapsedTime < mMin)
89 else if(elapsedTime > mMax)
95 mTotal += elapsedTime;
98 void FrameTimeStats::Reset()
100 mTimeState = WAITING_FOR_START_TIME;
101 mMinMaxTimeSet = false;
105 mStart = FrameTimeStamp();
109 float FrameTimeStats::GetMaxTime() const
111 return mMax * ONE_OVER_MICROSECONDS_TO_SECONDS;
114 float FrameTimeStats::GetMinTime() const
116 return mMin * ONE_OVER_MICROSECONDS_TO_SECONDS;
119 float FrameTimeStats::GetTotalTime() const
121 return mTotal * ONE_OVER_MICROSECONDS_TO_SECONDS;
124 unsigned int FrameTimeStats::GetRunCount() const
129 void FrameTimeStats::CalculateMean(float& meanOut, float& standardDeviationOut) const
131 if(mSamples.Size() > 0)
134 unsigned int sum = 0;
135 for(Samples::ConstIterator it = mSamples.Begin(), itEnd = mSamples.End(); it != itEnd; ++it)
137 unsigned int value = *it;
142 meanOut = static_cast<float>(sum) / mSamples.Size();
145 float variance = 0.0f;
146 for(Samples::ConstIterator it = mSamples.Begin(), itEnd = mSamples.End(); it != itEnd; ++it)
148 unsigned int value = *it;
150 float difference = static_cast<float>(value) - meanOut;
152 variance += difference * difference;
155 variance /= mSamples.Size();
157 // Standard deviation
158 standardDeviationOut = sqrtf(variance);
160 meanOut *= ONE_OVER_MICROSECONDS_TO_SECONDS;
161 standardDeviationOut *= ONE_OVER_MICROSECONDS_TO_SECONDS;
166 standardDeviationOut = 0.0f;
170 } // namespace Adaptor
172 } // namespace Internal