blob: aae89b5decb6c9ed55f8c6f317e5315ab8d3691a [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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<Js::InternalString, RegexStats*, ArenaAllocator, PrimeSizePolicy, DefaultComparer, JsUtil::DictionaryEntry> 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