// Copyright Epic Games, Inc. All Rights Reserved. #if (defined(__AUTORTFM) && __AUTORTFM) #include "Stats.h" #include "Utils.h" #include template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Total transactions: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Total commits: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Total aborts: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average transaction depth: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Maximum transaction depth: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average write log entries: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Maximum write log entries: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average write log bytes: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Maximum write log bytes: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" HitSet hits: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" HitSet misses: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" HitSet skip (stack local): %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average commit tasks: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Maximum commit tasks: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average abort tasks: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" Maximum abort tasks: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" New memory hits: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { AUTORTFM_LOG(" New memory misses: %" PRIu64, Data); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average hit set size: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); } template<> void AutoRTFM::FStats::Report(const uint64_t Data) const { const uint64_t TotalTransactions = Datas[static_cast(AutoRTFM::EStatsKind::Transaction)]; AUTORTFM_LOG(" Average hit set capacity: %15.3f", (static_cast(Data) / static_cast(TotalTransactions))); const uint64_t TotalHitSetSize = Datas[static_cast(AutoRTFM::EStatsKind::AverageHitSetSize)]; AUTORTFM_LOG(" Average hit set occupancy: %15.3f", 100 * (static_cast(TotalHitSetSize) / static_cast(Data))); } void AutoRTFM::FStats::Report() const { if constexpr (bCollectStats) { AUTORTFM_LOG("AutoRTFM Statistics:"); for (size_t I = 0; I < static_cast(AutoRTFM::EStatsKind::Total); I++) { switch (static_cast(I)) { default: AutoRTFM::InternalUnreachable(); break; #define REPORT_CASE(x) case (x): Report(Datas[static_cast(x)]); break REPORT_CASE(AutoRTFM::EStatsKind::Transaction); REPORT_CASE(AutoRTFM::EStatsKind::Commit); REPORT_CASE(AutoRTFM::EStatsKind::Abort); REPORT_CASE(AutoRTFM::EStatsKind::AverageTransactionDepth); REPORT_CASE(AutoRTFM::EStatsKind::MaximumTransactionDepth); REPORT_CASE(AutoRTFM::EStatsKind::AverageWriteLogEntries); REPORT_CASE(AutoRTFM::EStatsKind::MaximumWriteLogEntries); REPORT_CASE(AutoRTFM::EStatsKind::AverageWriteLogBytes); REPORT_CASE(AutoRTFM::EStatsKind::MaximumWriteLogBytes); REPORT_CASE(AutoRTFM::EStatsKind::HitSetHit); REPORT_CASE(AutoRTFM::EStatsKind::HitSetMiss); REPORT_CASE(AutoRTFM::EStatsKind::HitSetSkippedBecauseOfStackLocalMemory); REPORT_CASE(AutoRTFM::EStatsKind::AverageCommitTasks); REPORT_CASE(AutoRTFM::EStatsKind::MaximumCommitTasks); REPORT_CASE(AutoRTFM::EStatsKind::AverageAbortTasks); REPORT_CASE(AutoRTFM::EStatsKind::MaximumAbortTasks); REPORT_CASE(AutoRTFM::EStatsKind::NewMemoryTrackerHit); REPORT_CASE(AutoRTFM::EStatsKind::NewMemoryTrackerMiss); REPORT_CASE(AutoRTFM::EStatsKind::AverageHitSetSize); REPORT_CASE(AutoRTFM::EStatsKind::AverageHitSetCapacity); #undef REPORT_CASE } } } } AutoRTFM::FStats AutoRTFM::Stats; #endif // defined(__AUTORTFM) && __AUTORTFM