UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ScopedTimers.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
8#include "CoreGlobals.h"
9#include "HAL/PlatformTime.h"
13
14#include <atomic>
15
24double AtomicDoubleFetchAdd(std::atomic<double>& Value, double Delta,
25 std::memory_order MemoryOrder = std::memory_order_seq_cst);
26
32{
33public:
38
39 double Start()
40 {
42 return StartTime;
43 }
44
45 double Stop()
46 {
50
51 return StopTime;
52 }
53
54protected:
56 double StartTime;
58 double& Accumulator;
59};
60
66{
67public:
72
75 {
76 Stop();
77 }
78};
79
85{
86public:
88 : FScopedDurationTimer(AccumulatorValue)
89 , AccumulatorValue(0)
90 {
91 }
92
93 double GetTime()
94 {
95 Stop();
96 return AccumulatorValue;
97 }
98
99private:
100 double AccumulatorValue;
101};
102
103
109{
110public:
111 explicit FDurationAtomicTimer(std::atomic<double>& AccumulatorIn,
112 std::memory_order InMemoryOrder = std::memory_order_relaxed)
116 {}
117
118 double Start()
119 {
121 return StartTime;
122 }
123
124 double Stop()
125 {
129
130 return StopTime;
131 }
132
133protected:
135 double StartTime;
137 std::atomic<double>& Accumulator;
139 std::memory_order MemoryOrder;
140};
141
147{
148public:
149 explicit FScopedDurationAtomicTimer(std::atomic<double>& AccumulatorIn,
150 std::memory_order InMemoryOrder = std::memory_order_relaxed)
152 {
153 }
154
157 {
158 Stop();
159 }
160};
161
168template <typename ThreadSafeCounterClass>
170{
171public:
173 :Counter(InCounter)
174 , StartCycles(FPlatformTime::Cycles())
175 {
176 }
178 {
179 Counter.Add(FPlatformTime::Cycles() - StartCycles);
180 }
181private:
182 ThreadSafeCounterClass& Counter;
183 int32 StartCycles;
184};
185
188
194{
195public:
196 explicit FScopedDurationTimeLogger(FString InMsg = TEXT("Scoped action"), FOutputDevice* InDevice = GLog)
197 : Msg (MoveTemp(InMsg))
198 , Device (InDevice)
199 , Accumulator(0.0)
200 , Timer (Accumulator)
201 {
202 Timer.Start();
203 }
204
206 {
207 Timer.Stop();
208 Device->Logf(TEXT("%s: %f secs"), *Msg, Accumulator);
209 }
210
211private:
212 FString Msg;
213 FOutputDevice* Device;
214 double Accumulator;
215 FDurationTimer Timer;
216};
217
224{
225public:
232
240
241 double Start()
242 {
244 return StartTime;
245 }
246
247protected:
249 double StartTime;
251 double& Accumulator;
253};
254
273
279template<class Func>
281{
282public:
284 : Title(InTitle)
285 , LogFunc(InLogFunc)
286 , LocalTime(-FPlatformTime::Seconds())
287 , TotalTime(InTotalTime)
288 {
289 LogFunc(*FString::Printf(TEXT("%s started..."), InTitle));
290 }
291
293 {
294 LocalTime += FPlatformTime::Seconds();
295 TotalTime += LocalTime;
296
298 Msg.Appendf(TEXT("%s took %s"), *Title, *FPlatformTime::PrettyTime(LocalTime));
299
300 if (TotalTime > LocalTime)
301 {
302 Msg.Appendf(TEXT(" (total: %s)"), *FPlatformTime::PrettyTime(TotalTime));
303 }
304
305 LogFunc(*Msg);
306 }
307
308private:
309 FString Title;
310 Func LogFunc;
311 double LocalTime;
312 double& TotalTime;
313};
314
315
316inline double AtomicDoubleFetchAdd(std::atomic<double>& Value, double Delta,
317 std::memory_order MemoryOrder)
318{
319 double Expected = Value.load(std::memory_order_relaxed);
320 double Desired;
321 std::memory_order ReadModifyWriteMemoryOrder =
322 MemoryOrder == std::memory_order_relaxed ? std::memory_order_relaxed
323 : MemoryOrder == std::memory_order_acq_rel ? std::memory_order_acq_rel
324 : std::memory_order_seq_cst;
325
326 bool bExchangeSucceeded = false;
327 do
328 {
329 Desired = Expected + Delta;
330 bExchangeSucceeded = Value.compare_exchange_weak(Expected, Desired,
331 /* success order */ ReadModifyWriteMemoryOrder,
332 /* failure order */ std::memory_order_relaxed);
333 } while (!bExchangeSucceeded);
334
335 return Expected;
336}
337
338#if NO_LOGGING
339#define UE_SCOPED_TIMER(Title, Category, Verbosity)
340#else
341#define UE_SCOPED_TIMER(Title, Category, Verbosity) \
342 static double UE_SCOPED_TIMER_COMBINE(ScopedTimerTotal_,__LINE__) = 0.0; FScopedDurationTimeCustomLogger UE_SCOPED_TIMER_COMBINE(ScopedTimer_,__LINE__)(Title, UE_SCOPED_TIMER_COMBINE(ScopedTimerTotal_,__LINE__), [](const TCHAR* Msg) { UE_LOG(Category, Verbosity, TEXT("%s"), Msg) })
343
344#define UE_SCOPED_TIMER_COMBINE_INNER(A,B) A##B
345#define UE_SCOPED_TIMER_COMBINE(A,B) UE_SCOPED_TIMER_COMBINE_INNER(A,B)
346#endif
#define GLog
Definition CoreGlobals.h:95
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
TScopedDurationThreadSafeTimer< FThreadSafeCounter64 > FScopedDurationThreadSafeTimer64
Definition ScopedTimers.h:187
double AtomicDoubleFetchAdd(std::atomic< double > &Value, double Delta, std::memory_order MemoryOrder=std::memory_order_seq_cst)
Definition ScopedTimers.h:316
TScopedDurationThreadSafeTimer< FThreadSafeCounter > FScopedDurationThreadSafeTimer
Definition ScopedTimers.h:186
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition ScopedTimers.h:85
double GetTime()
Definition ScopedTimers.h:93
FAutoScopedDurationTimer()
Definition ScopedTimers.h:87
Definition ScopedTimers.h:109
double Stop()
Definition ScopedTimers.h:124
double StartTime
Definition ScopedTimers.h:135
std::memory_order MemoryOrder
Definition ScopedTimers.h:139
std::atomic< double > & Accumulator
Definition ScopedTimers.h:137
double Start()
Definition ScopedTimers.h:118
FDurationAtomicTimer(std::atomic< double > &AccumulatorIn, std::memory_order InMemoryOrder=std::memory_order_relaxed)
Definition ScopedTimers.h:111
Definition ScopedTimers.h:32
double StartTime
Definition ScopedTimers.h:56
double & Accumulator
Definition ScopedTimers.h:58
double Stop()
Definition ScopedTimers.h:45
FDurationTimer(double &AccumulatorIn)
Definition ScopedTimers.h:34
double Start()
Definition ScopedTimers.h:39
Definition OutputDevice.h:133
void Logf(const FmtType &Fmt)
Definition OutputDevice.h:234
Definition ScopedTimers.h:147
FScopedDurationAtomicTimer(std::atomic< double > &AccumulatorIn, std::memory_order InMemoryOrder=std::memory_order_relaxed)
Definition ScopedTimers.h:149
~FScopedDurationAtomicTimer()
Definition ScopedTimers.h:156
Definition ScopedTimers.h:281
~FScopedDurationTimeCustomLogger()
Definition ScopedTimers.h:292
FScopedDurationTimeCustomLogger(const TCHAR *InTitle, double &InTotalTime, Func InLogFunc)
Definition ScopedTimers.h:283
Definition ScopedTimers.h:194
FScopedDurationTimeLogger(FString InMsg=TEXT("Scoped action"), FOutputDevice *InDevice=GLog)
Definition ScopedTimers.h:196
~FScopedDurationTimeLogger()
Definition ScopedTimers.h:205
Definition ScopedTimers.h:66
~FScopedDurationTimer()
Definition ScopedTimers.h:74
FScopedDurationTimer(double &AccumulatorIn)
Definition ScopedTimers.h:68
Definition ScopedTimers.h:262
FScopedSwitchedCountedDurationTimer(double &TimeAccumulatorIn, int32 &CountAccumlatorIn, bool bDoFunctionalityIn)
Definition ScopedTimers.h:264
Definition ScopedTimers.h:224
~FScopedSwitchedDurationTimer()
Definition ScopedTimers.h:233
const bool bDoFunctionality
Definition ScopedTimers.h:252
FScopedSwitchedDurationTimer(double &AccumulatorIn, bool bDoFunctionalityIn)
Definition ScopedTimers.h:226
double & Accumulator
Definition ScopedTimers.h:251
double StartTime
Definition ScopedTimers.h:249
double Start()
Definition ScopedTimers.h:241
Definition ScopedTimers.h:170
~TScopedDurationThreadSafeTimer()
Definition ScopedTimers.h:177
TScopedDurationThreadSafeTimer(ThreadSafeCounterClass &InCounter)
Definition ScopedTimers.h:172
BuilderType & Appendf(const FmtType &Fmt, Types... Args)
Definition StringBuilder.h:419
Definition StringBuilder.h:509
Definition AndroidPlatformTime.h:18
static uint32 Cycles()
Definition AndroidPlatformTime.h:27
static double Seconds()
Definition AndroidPlatformTime.h:20
static CORE_API FString PrettyTime(double Seconds)
Definition GenericPlatformTime.cpp:121