forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPerfTestBase.cs
More file actions
110 lines (90 loc) · 2.99 KB
/
PerfTestBase.cs
File metadata and controls
110 lines (90 loc) · 2.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace ServiceStack.Common.Tests
{
public class PerfTestBase
{
protected int DefaultIterations { get; set; }
protected List<int> MultipleIterations { get; set; }
public PerfTestBase()
{
this.DefaultIterations = 10000;
this.MultipleIterations = new List<int> { 1000, 10000, 100000, 1000000 };
}
protected StringBuilder SbLog = new StringBuilder();
public void Log(string message, params object[] args)
{
Console.WriteLine(message, args);
SbLog.AppendFormat(message, args);
SbLog.AppendLine();
}
protected void CompareMultipleRuns(string run1Name, Action run1Action, string run2Name, Action run2Action)
{
WarmUp(run1Action, run2Action);
foreach (var iteration in this.MultipleIterations)
{
Log("\n{0} times:", iteration);
CompareRuns(iteration, run1Name, run1Action, run2Name, run2Action);
}
}
protected void CompareRuns(string run1Name, Action run1Action, string run2Name, Action run2Action)
{
CompareRuns(DefaultIterations, run1Name, run1Action, run2Name, run2Action);
}
protected void CompareRuns(int iterations, string run1Name, Action run1Action, string run2Name, Action run2Action)
{
var run1 = RunAction(run1Action, iterations, run1Name);
var run2 = RunAction(run2Action, iterations, run2Name);
var runDiff = run1.Ticks - run2.Ticks;
var run1IsSlower = runDiff > 0;
var slowerRun = run1IsSlower ? run1Name : run2Name;
var fasterRun = run1IsSlower ? run2Name : run1Name;
var runDiffTime = run1IsSlower ? runDiff : runDiff * -1;
var runDiffAvg = run1IsSlower ? run1.Ticks / (double)run2.Ticks : run2.Ticks / (double)run1.Ticks;
Log("{0} was {1}ms or {2} times slower than {3}",
slowerRun, runDiffTime, Math.Round(runDiffAvg, 2), fasterRun);
}
protected void WarmUp(params Action[] actions)
{
foreach (var action in actions)
{
action();
GC.Collect();
}
}
protected void RunMultipleTimes(Action action, string actionName)
{
WarmUp(action);
foreach (var iteration in this.MultipleIterations)
{
Log("\n{0} times:", iteration);
RunAction(action, iteration, actionName ?? "Action");
}
}
protected TimeSpan RunAction(Action action, int iterations)
{
return RunAction(action, iterations, null);
}
protected TimeSpan RunAction(Action action, int iterations, string actionName)
{
actionName = actionName ?? action.GetType().Name;
var ticksTaken = Measure(action, iterations);
var timeSpan = TimeSpan.FromSeconds(ticksTaken * 1d / Stopwatch.Frequency);
Log("{0} took {1}ms ({2} ticks), avg: {3} ticks", actionName, timeSpan.TotalMilliseconds, timeSpan.Ticks, (timeSpan.Ticks / iterations));
return timeSpan;
}
protected long Measure(Action action, decimal iterations)
{
GC.Collect();
var begin = Stopwatch.GetTimestamp();
for (var i = 0; i < iterations; i++)
{
action();
}
var end = Stopwatch.GetTimestamp();
return (end - begin);
}
}
}