Skip to content

Commit 95596e9

Browse files
authored
[wasm] Add few Span and String measurements (#79566)
Measure Span<T> SequenceEqual for bytes and chars Measure string.Normalize for ASCII and non-ASCII
1 parent 2e35188 commit 95596e9

File tree

2 files changed

+164
-3
lines changed

2 files changed

+164
-3
lines changed

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

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public SpanTask()
1919
new ReverseChar(),
2020
new IndexOfByte(),
2121
new IndexOfChar(),
22+
new SequenceEqualByte(),
23+
new SequenceEqualChar(),
2224
};
2325
}
2426

@@ -39,7 +41,7 @@ public abstract class SpanMeasurement : BenchTask.Measurement
3941
abstract class SpanByteMeasurement : SpanMeasurement
4042
{
4143
protected byte[] data;
42-
int len = 64 * 1024;
44+
protected int len = 64 * 1024;
4345

4446
public override Task BeforeBatch()
4547
{
@@ -77,14 +79,14 @@ class IndexOfByte : SpanByteMeasurement
7779
public override void RunStep()
7880
{
7981
var span = new Span<byte>(data);
80-
span.IndexOf<byte> ((byte)random.Next(256));
82+
span.IndexOf<byte>((byte)random.Next(256));
8183
}
8284
}
8385

8486
abstract class SpanCharMeasurement : SpanMeasurement
8587
{
8688
protected char[] data;
87-
int len = 64 * 1024;
89+
protected int len = 64 * 1024;
8890

8991
public override Task BeforeBatch()
9092
{
@@ -123,5 +125,75 @@ public override void RunStep()
123125
span.IndexOf<char>((char)random.Next(0x10000));
124126
}
125127
}
128+
129+
class SequenceEqualByte : SpanByteMeasurement
130+
{
131+
public override string Name => "SequenceEqual bytes";
132+
133+
protected byte[] data2;
134+
135+
public override Task BeforeBatch()
136+
{
137+
base.BeforeBatch();
138+
139+
data2 = new byte[len];
140+
random = new(234567);
141+
for (int i = 0; i < len; i++)
142+
data2[i] = (i < 3 * len / 4) ? data[i] : (byte)random.Next(0x100);
143+
144+
return Task.CompletedTask;
145+
}
146+
147+
public override Task AfterBatch()
148+
{
149+
base.AfterBatch();
150+
151+
data2 = null;
152+
153+
return Task.CompletedTask;
154+
}
155+
156+
public override void RunStep()
157+
{
158+
var span = new Span<byte>(data);
159+
var span2 = new ReadOnlySpan<byte>(data2);
160+
span.SequenceEqual(span2);
161+
}
162+
}
163+
164+
class SequenceEqualChar : SpanCharMeasurement
165+
{
166+
public override string Name => "SequenceEqual chars";
167+
168+
protected char[] data2;
169+
170+
public override Task BeforeBatch()
171+
{
172+
base.BeforeBatch();
173+
174+
data2 = new char[len];
175+
random = new(234567);
176+
for (int i = 0; i < len; i++)
177+
data2[i] = (i < 3 * len / 4) ? data[i] : (char)random.Next(0x10000);
178+
179+
return Task.CompletedTask;
180+
}
181+
182+
public override Task AfterBatch()
183+
{
184+
base.AfterBatch();
185+
186+
data2 = null;
187+
188+
return Task.CompletedTask;
189+
}
190+
191+
public override void RunStep()
192+
{
193+
var span = new Span<char>(data);
194+
var span2 = new ReadOnlySpan<char>(data2);
195+
span.SequenceEqual(span2);
196+
}
197+
}
126198
}
127199
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Runtime.InteropServices;
6+
using System.Threading.Tasks;
7+
8+
namespace Sample
9+
{
10+
class StringTask : BenchTask
11+
{
12+
public override string Name => "String";
13+
Measurement[] measurements;
14+
15+
public StringTask()
16+
{
17+
measurements = new Measurement[] {
18+
new NormalizeMeasurement(),
19+
new NormalizeMeasurementASCII(),
20+
};
21+
}
22+
23+
public override Measurement[] Measurements
24+
{
25+
get
26+
{
27+
return measurements;
28+
}
29+
}
30+
31+
public abstract class StringMeasurement : BenchTask.Measurement
32+
{
33+
public override int InitialSamples => 30;
34+
protected Random random;
35+
}
36+
37+
public class NormalizeMeasurement : StringMeasurement
38+
{
39+
protected char[] data;
40+
protected int len = 64 * 1024;
41+
protected string str;
42+
43+
public override Task BeforeBatch()
44+
{
45+
data = new char[len];
46+
random = new(123456);
47+
for (int i = 0; i < len; i++)
48+
{
49+
data[i] = (char)random.Next(0xd800);
50+
}
51+
52+
str = new string(data);
53+
54+
return Task.CompletedTask;
55+
}
56+
57+
public override Task AfterBatch()
58+
{
59+
data = null;
60+
61+
return Task.CompletedTask;
62+
}
63+
64+
public override string Name => "Normalize";
65+
66+
public override void RunStep()
67+
{
68+
str.Normalize();
69+
}
70+
}
71+
72+
public class NormalizeMeasurementASCII : NormalizeMeasurement
73+
{
74+
public override Task BeforeBatch()
75+
{
76+
data = new char[len];
77+
random = new(123456);
78+
for (int i = 0; i < len; i++)
79+
data[i] = (char)random.Next(0x80);
80+
81+
str = new string(data);
82+
83+
return Task.CompletedTask;
84+
}
85+
86+
public override string Name => "Normalize ASCII";
87+
}
88+
}
89+
}

0 commit comments

Comments
 (0)