You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.8 KiB
101 lines
2.8 KiB
8 months ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
using BestHTTP.Core;
|
||
|
|
||
|
namespace BestHTTP.Timings
|
||
|
{
|
||
|
public sealed class TimingCollector
|
||
|
{
|
||
|
public HTTPRequest ParentRequest { get; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// When the TimingCollector instance created.
|
||
|
/// </summary>
|
||
|
public DateTime Start { get; private set; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// List of added events.
|
||
|
/// </summary>
|
||
|
public List<TimingEvent> Events { get; private set; }
|
||
|
|
||
|
public TimingCollector(HTTPRequest parentRequest)
|
||
|
{
|
||
|
this.ParentRequest = parentRequest;
|
||
|
this.Start = DateTime.Now;
|
||
|
}
|
||
|
|
||
|
internal void AddEvent(string name, DateTime when, TimeSpan duration)
|
||
|
{
|
||
|
if (this.Events == null)
|
||
|
this.Events = new List<TimingEvent>();
|
||
|
|
||
|
if (duration == TimeSpan.Zero)
|
||
|
{
|
||
|
DateTime prevEventAt = this.Start;
|
||
|
if (this.Events.Count > 0)
|
||
|
prevEventAt = this.Events[this.Events.Count - 1].When;
|
||
|
duration = when - prevEventAt;
|
||
|
}
|
||
|
this.Events.Add(new TimingEvent(name, when, duration));
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Add an event. Duration is calculated from the previous event or start of the collector.
|
||
|
/// </summary>
|
||
|
public void Add(string name)
|
||
|
{
|
||
|
RequestEventHelper.EnqueueRequestEvent(new RequestEventInfo(this.ParentRequest, name, DateTime.Now));
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Add an event with a known duration.
|
||
|
/// </summary>
|
||
|
public void Add(string name, TimeSpan duration)
|
||
|
{
|
||
|
RequestEventHelper.EnqueueRequestEvent(new RequestEventInfo(this.ParentRequest, name, duration));
|
||
|
}
|
||
|
|
||
|
public TimingEvent FindFirst(string name)
|
||
|
{
|
||
|
if (this.Events == null)
|
||
|
return TimingEvent.Empty;
|
||
|
|
||
|
for (int i = 0; i < this.Events.Count; ++i)
|
||
|
{
|
||
|
if (this.Events[i].Name == name)
|
||
|
return this.Events[i];
|
||
|
}
|
||
|
|
||
|
return TimingEvent.Empty;
|
||
|
}
|
||
|
|
||
|
public TimingEvent FindLast(string name)
|
||
|
{
|
||
|
if (this.Events == null)
|
||
|
return TimingEvent.Empty;
|
||
|
|
||
|
for (int i = this.Events.Count - 1; i >= 0; --i)
|
||
|
{
|
||
|
if (this.Events[i].Name == name)
|
||
|
return this.Events[i];
|
||
|
}
|
||
|
|
||
|
return TimingEvent.Empty;
|
||
|
}
|
||
|
|
||
|
public override string ToString()
|
||
|
{
|
||
|
string result = string.Format("[TimingCollector Start: '{0}' ", this.Start.ToLongTimeString());
|
||
|
|
||
|
if (this.Events != null)
|
||
|
foreach (var @event in this.Events)
|
||
|
result += '\n' + @event.ToString();
|
||
|
|
||
|
result += "]";
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
}
|