Skip to content

Commit d1bf019

Browse files
authored
[wasm][bench] Limit initial samples (#86953)
* [wasm][bench] Limit initial samples Try to limit initial samples measurement to 1 second. Currently some of string measurements with hybrid globalization turned on can take hundreds of seconds. This makes the browser stop the benchmark and the measurement job times out. This should limit the initial samples to take cca 1 second or take just one initial sample if it takes more time. Also increase the initial samples for string comparison, where it was on the edge and the times were flipping between cca 5 and 10 seconds. * Do GC collect only when doing initial samples
1 parent fbf1f72 commit d1bf019

File tree

3 files changed

+40
-17
lines changed

3 files changed

+40
-17
lines changed

src/mono/sample/wasm/browser-bench/BenchTask.cs

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,16 @@ public virtual void RunStep() { }
5959

6060
public virtual bool HasRunStepAsync => false;
6161

62-
protected virtual int CalculateSteps(int milliseconds, TimeSpan initTs)
62+
protected virtual int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
6363
{
64-
return (int)(milliseconds * InitialSamples / Math.Max(1.0, initTs.TotalMilliseconds));
64+
return (int)(milliseconds * initialSamples / Math.Max(1.0, initTs.TotalMilliseconds));
6565
}
6666

6767
public async Task<Result> RunBatch(BenchTask task, int milliseconds)
6868
{
6969
DateTime start = DateTime.Now;
7070
DateTime end;
71+
int initialSamples = InitialSamples;
7172
try
7273
{
7374
// run one to eliminate possible startup overhead and do GC collection
@@ -79,15 +80,35 @@ public async Task<Result> RunBatch(BenchTask task, int milliseconds)
7980
GC.Collect();
8081

8182
start = DateTime.Now;
82-
for (currentStep = 0; currentStep < InitialSamples; currentStep++)
83-
if (HasRunStepAsync)
84-
await RunStepAsync();
85-
else
86-
RunStep();
83+
if (HasRunStepAsync)
84+
await RunStepAsync();
85+
else
86+
RunStep();
8787
end = DateTime.Now;
8888

89+
// try to limit initial samples to 1s
90+
var oneTs = end - start;
91+
var maxInitMs = 1000;
92+
if (oneTs.TotalMilliseconds > 0 && oneTs.TotalMilliseconds*InitialSamples > maxInitMs)
93+
initialSamples = (int)(maxInitMs/oneTs.TotalMilliseconds);
94+
95+
if (initialSamples > 1) {
96+
GC.Collect();
97+
98+
start = DateTime.Now;
99+
for (currentStep = 0; currentStep < initialSamples; currentStep++)
100+
if (HasRunStepAsync)
101+
await RunStepAsync();
102+
else
103+
RunStep();
104+
end = DateTime.Now;
105+
} else {
106+
// we already have the 1st measurement
107+
initialSamples = 1;
108+
}
109+
89110
var initTs = end - start;
90-
int steps = CalculateSteps(milliseconds, initTs);
111+
int steps = CalculateSteps(milliseconds, initTs, initialSamples);
91112

92113
start = DateTime.Now;
93114
for (currentStep = 0; currentStep < steps; currentStep++)
@@ -101,14 +122,14 @@ public async Task<Result> RunBatch(BenchTask task, int milliseconds)
101122

102123
var ts = end - start;
103124

104-
return new Result { span = ts + initTs, steps = steps + InitialSamples, taskName = task.Name, measurementName = Name };
125+
return new Result { span = ts + initTs, steps = steps + initialSamples, taskName = task.Name, measurementName = Name };
105126
}
106127
catch (Exception ex)
107128
{
108129
end = DateTime.Now;
109130
var ts = end - start;
110131
Console.WriteLine(ex);
111-
return new Result { span = ts, steps = currentStep + InitialSamples, taskName = task.Name, measurementName = Name + " " + ex.Message };
132+
return new Result { span = ts, steps = currentStep + initialSamples, taskName = task.Name, measurementName = Name + " " + ex.Message };
112133
}
113134
}
114135
}

src/mono/sample/wasm/browser-bench/String.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ public class TextInfoToTitleCase : TextInfoMeasurement
139139

140140
public abstract class StringsCompare : StringMeasurement
141141
{
142+
public override int InitialSamples => 100;
143+
142144
protected string strAsciiSuffix;
143145
protected string strAsciiPrefix;
144146
protected string needleSameAsStrEnd;

src/mono/sample/wasm/browser-bench/WebSocket.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public class PartialSend_1BMeasurement : WebSocketMeasurement
8888
public override int InitialSamples => 1000;
8989
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1]);
9090

91-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
91+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
9292
{
9393
return 250_000;
9494
}
@@ -112,7 +112,7 @@ public PartialSend_64KBMeasurement()
112112
buffer[i] = (byte)(i & 0xff);
113113
}
114114
}
115-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
115+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
116116
{
117117
return 3000;
118118
}
@@ -137,7 +137,7 @@ public PartialSend_1MBMeasurement()
137137
buffer[i] = (byte)(i & 0xff);
138138
}
139139
}
140-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
140+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
141141
{
142142
return 100;
143143
}
@@ -154,9 +154,9 @@ public class PartialReceive_1BMeasurement : WebSocketReceiveMeasurement
154154
{
155155
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1]);
156156

157-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
157+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
158158
{
159-
return MaxLength - InitialSamples - 100;
159+
return MaxLength - initialSamples - 100;
160160
}
161161

162162
public override void RunStep()
@@ -177,7 +177,7 @@ public class PartialReceive_10KBMeasurement : WebSocketReceiveMeasurement
177177
public override int InitialSamples => 1;
178178
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[bufferSize]);
179179

180-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
180+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
181181
{
182182
return 500;
183183
}
@@ -206,7 +206,7 @@ public class PartialReceive_100KBMeasurement : WebSocketReceiveMeasurement
206206
public override int InitialSamples => 1;
207207
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[bufferSize]);
208208

209-
protected override int CalculateSteps(int milliseconds, TimeSpan initTs)
209+
protected override int CalculateSteps(int milliseconds, TimeSpan initTs, int initialSamples)
210210
{
211211
return MaxMessages - 1;
212212
}

0 commit comments

Comments
 (0)