//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once #if ENABLE_REGEX_CONFIG_OPTIONS namespace UnifiedRegex { struct RegexStats { typedef long long Ticks; enum Phase { Parse, Compile, Execute, NumPhases }; static const char16* PhaseNames[NumPhases]; enum Use { Match, Exec, Test, Replace, Split, Search, NumUses }; static const char16* UseNames[NumUses]; RegexPattern* pattern; // null => total record // Time spent on regex Ticks phaseTicks[NumPhases]; // How is regex used? uint64 useCounts[NumUses]; // Total input length uint64 inputLength; // Total chars looked at (may be > length if backtrack, < length if using Boyer-Moore) uint64 numCompares; // Number of continuation stack pushes uint64 numPushes; // Number of continuation stack pops uint64 numPops; // Continuation stack high-water-mark uint64 stackHWM; // Number of instructions executed uint64 numInsts; RegexStats(RegexPattern* pattern); void Print(DebugWriter* w, RegexStats* totals, Ticks ticksPerMillisecond); void Add(RegexStats* other); }; typedef JsUtil::BaseDictionary RegexStatsMap; class RegexStatsDatabase { private: RegexStats::Ticks ticksPerMillisecond; RegexStats::Ticks start; ArenaAllocator* allocator; RegexStatsMap* map; static RegexStats::Ticks Now(); static RegexStats::Ticks Freq(); public: RegexStatsDatabase(ArenaAllocator* allocator); RegexStats* GetRegexStats(RegexPattern* pattern); void BeginProfile(); void EndProfile(RegexStats* stats, RegexStats::Phase phase); void Print(DebugWriter* w); }; } #endif