Skip to content

Commit bb32a79

Browse files
author
Jimmy
authored
benchmark convert (#3509)
1 parent a38d618 commit bb32a79

File tree

3 files changed

+220
-3
lines changed

3 files changed

+220
-3
lines changed

benchmarks/Neo.VM.Benchmarks/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
using BenchmarkDotNet.Running;
1313
using Neo.VM.Benchmark;
1414

15-
BenchmarkRunner.Run<Benchmarks_PoCs>();
15+
BenchmarkRunner.Run<Benchmarks_Convert>();
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
// Copyright (C) 2015-2024 The Neo Project.
2+
//
3+
// Benchmarks_Convert.cs file belongs to the neo project and is free
4+
// software distributed under the MIT software license, see the
5+
// accompanying file LICENSE in the main directory of the
6+
// repository or http://www.opensource.org/licenses/mit-license.php
7+
// for more details.
8+
//
9+
// Redistribution and use in source and binary forms with or without
10+
// modifications are permitted.
11+
12+
using BenchmarkDotNet.Attributes;
13+
using Neo.VM.Types;
14+
using System.Collections.Generic;
15+
using Array = Neo.VM.Types.Array;
16+
using Buffer = Neo.VM.Types.Buffer;
17+
18+
namespace Neo.VM.Benchmark;
19+
20+
public class Benchmarks_Convert
21+
{
22+
private Dictionary<StackItemType, List<StackItem>> testItemsByType;
23+
24+
[GlobalSetup]
25+
public void Setup()
26+
{
27+
testItemsByType = CreateTestItemsByType();
28+
}
29+
30+
[Benchmark]
31+
[ArgumentsSource(nameof(GetTypeConversionPairs))]
32+
public void BenchConvertTo(StackItemType fromType, StackItemType toType)
33+
{
34+
foreach (var item in testItemsByType[fromType])
35+
{
36+
try
37+
{
38+
_ = item.ConvertTo(toType);
39+
}
40+
catch (Exception)
41+
{
42+
// Ignore invalid casts as they're expected for some conversions
43+
}
44+
}
45+
}
46+
47+
public IEnumerable<object[]> GetTypeConversionPairs()
48+
{
49+
var types = (StackItemType[])Enum.GetValues(typeof(StackItemType));
50+
foreach (var fromType in types)
51+
{
52+
foreach (var toType in types)
53+
{
54+
yield return new object[] { fromType, toType };
55+
}
56+
}
57+
}
58+
59+
private Dictionary<StackItemType, List<StackItem>> CreateTestItemsByType()
60+
{
61+
var referenceCounter = new ReferenceCounter();
62+
var result = new Dictionary<StackItemType, List<StackItem>>();
63+
64+
foreach (StackItemType type in Enum.GetValues(typeof(StackItemType)))
65+
{
66+
result[type] = new List<StackItem>();
67+
}
68+
69+
result[StackItemType.Boolean].Add(StackItem.True);
70+
result[StackItemType.Boolean].Add(StackItem.False);
71+
72+
result[StackItemType.Integer].Add(new Integer(42));
73+
result[StackItemType.Integer].Add(new Integer(-1));
74+
75+
result[StackItemType.ByteString].Add(new ByteString(new byte[] { 1, 2, 3 }));
76+
result[StackItemType.ByteString].Add(new ByteString(new byte[] { 255, 0, 128 }));
77+
78+
// Create a 128-byte buffer
79+
var longBuffer = new byte[128];
80+
for (int i = 0; i < 128; i++) longBuffer[i] = (byte)(i % 256);
81+
result[StackItemType.Buffer].Add(new Buffer(longBuffer));
82+
result[StackItemType.Buffer].Add(new Buffer(new byte[128])); // Another 128-byte buffer, all zeros
83+
84+
// Create an array with 10 items
85+
var longArray = new Array(referenceCounter);
86+
for (int i = 0; i < 10; i++) longArray.Add(new Integer(i));
87+
result[StackItemType.Array].Add(longArray);
88+
result[StackItemType.Array].Add(new Array(referenceCounter) { StackItem.True, new ByteString(new byte[] { 3, 4, 5 }) });
89+
90+
// Create a struct with 10 items
91+
var longStruct = new Struct(referenceCounter);
92+
for (int i = 0; i < 10; i++) longStruct.Add(new Integer(i * 10));
93+
result[StackItemType.Struct].Add(longStruct);
94+
result[StackItemType.Struct].Add(new Struct(referenceCounter) { StackItem.False, new Buffer(new byte[] { 6, 7, 8 }) });
95+
96+
// Create a map with 10 items
97+
var longMap = new Map(referenceCounter);
98+
for (int i = 0; i < 10; i++) longMap[new Integer(i)] = new ByteString(new byte[] { (byte)(i * 20) });
99+
result[StackItemType.Map].Add(longMap);
100+
result[StackItemType.Map].Add(new Map(referenceCounter) { [new ByteString(new byte[] { 9 })] = StackItem.True });
101+
102+
result[StackItemType.InteropInterface].Add(new InteropInterface(new object()));
103+
result[StackItemType.InteropInterface].Add(new InteropInterface("test string"));
104+
105+
return result;
106+
}
107+
}
108+
109+
// BenchmarkDotNet v0.13.12, Windows 11 (10.0.22631.4249/23H2/2023Update/SunValley3)
110+
// Intel Core i9-14900HX, 1 CPU, 32 logical and 24 physical cores
111+
// .NET SDK 8.0.205
112+
// [Host] : .NET 8.0.5 (8.0.524.21615), X64 RyuJIT AVX2
113+
// DefaultJob : .NET 8.0.5 (8.0.524.21615), X64 RyuJIT AVX2
114+
//
115+
//
116+
// | Method | fromType | toType | Mean | Error | StdDev |
117+
// |--------------- |----------------- |----------------- |-------------:|------------:|------------:|
118+
// | BenchConvertTo | Any | Any | 1.762 ns | 0.0195 ns | 0.0182 ns |
119+
// | BenchConvertTo | Any | Pointer | 1.791 ns | 0.0196 ns | 0.0183 ns |
120+
// | BenchConvertTo | Any | Boolean | 1.774 ns | 0.0245 ns | 0.0229 ns |
121+
// | BenchConvertTo | Any | Integer | 1.781 ns | 0.0236 ns | 0.0220 ns |
122+
// | BenchConvertTo | Any | ByteString | 1.767 ns | 0.0255 ns | 0.0226 ns |
123+
// | BenchConvertTo | Any | Buffer | 1.774 ns | 0.0217 ns | 0.0203 ns |
124+
// | BenchConvertTo | Any | Array | 1.770 ns | 0.0412 ns | 0.0385 ns |
125+
// | BenchConvertTo | Any | Struct | 1.787 ns | 0.0227 ns | 0.0212 ns |
126+
// | BenchConvertTo | Any | Map | 1.796 ns | 0.0292 ns | 0.0273 ns |
127+
// | BenchConvertTo | Any | InteropInterface | 1.820 ns | 0.0549 ns | 0.0675 ns |
128+
// | BenchConvertTo | Pointer | Any | 2.312 ns | 0.0210 ns | 0.0175 ns |
129+
// | BenchConvertTo | Pointer | Pointer | 2.337 ns | 0.0157 ns | 0.0146 ns |
130+
// | BenchConvertTo | Pointer | Boolean | 2.352 ns | 0.0190 ns | 0.0169 ns |
131+
// | BenchConvertTo | Pointer | Integer | 2.334 ns | 0.0231 ns | 0.0216 ns |
132+
// | BenchConvertTo | Pointer | ByteString | 2.317 ns | 0.0298 ns | 0.0279 ns |
133+
// | BenchConvertTo | Pointer | Buffer | 2.329 ns | 0.0274 ns | 0.0256 ns |
134+
// | BenchConvertTo | Pointer | Array | 2.338 ns | 0.0257 ns | 0.0241 ns |
135+
// | BenchConvertTo | Pointer | Struct | 2.336 ns | 0.0318 ns | 0.0298 ns |
136+
// | BenchConvertTo | Pointer | Map | 2.351 ns | 0.0676 ns | 0.0903 ns |
137+
// | BenchConvertTo | Pointer | InteropInterface | 2.281 ns | 0.0133 ns | 0.0125 ns |
138+
// | BenchConvertTo | Boolean | Any | 5,926.451 ns | 118.1195 ns | 136.0266 ns |
139+
// | BenchConvertTo | Boolean | Pointer | 6,001.282 ns | 15.3048 ns | 12.7802 ns |
140+
// | BenchConvertTo | Boolean | Boolean | 4.459 ns | 0.0151 ns | 0.0133 ns |
141+
// | BenchConvertTo | Boolean | Integer | 14.104 ns | 0.1526 ns | 0.1428 ns |
142+
// | BenchConvertTo | Boolean | ByteString | 11.650 ns | 0.0539 ns | 0.0450 ns |
143+
// | BenchConvertTo | Boolean | Buffer | 26.106 ns | 0.1549 ns | 0.1449 ns |
144+
// | BenchConvertTo | Boolean | Array | 5,813.116 ns | 28.1911 ns | 26.3700 ns |
145+
// | BenchConvertTo | Boolean | Struct | 5,809.844 ns | 19.1249 ns | 15.9702 ns |
146+
// | BenchConvertTo | Boolean | Map | 6,061.558 ns | 29.3991 ns | 27.4999 ns |
147+
// | BenchConvertTo | Boolean | InteropInterface | 5,924.682 ns | 80.5533 ns | 75.3496 ns |
148+
// | BenchConvertTo | Integer | Any | 5,240.903 ns | 41.0628 ns | 38.4102 ns |
149+
// | BenchConvertTo | Integer | Pointer | 5,479.116 ns | 75.8232 ns | 70.9251 ns |
150+
// | BenchConvertTo | Integer | Boolean | 5.981 ns | 0.0445 ns | 0.0416 ns |
151+
// | BenchConvertTo | Integer | Integer | 4.277 ns | 0.0177 ns | 0.0166 ns |
152+
// | BenchConvertTo | Integer | ByteString | 19.053 ns | 0.2125 ns | 0.1883 ns |
153+
// | BenchConvertTo | Integer | Buffer | 32.782 ns | 0.1653 ns | 0.1380 ns |
154+
// | BenchConvertTo | Integer | Array | 4,693.207 ns | 14.2446 ns | 12.6275 ns |
155+
// | BenchConvertTo | Integer | Struct | 4,737.341 ns | 60.1813 ns | 56.2936 ns |
156+
// | BenchConvertTo | Integer | Map | 4,808.431 ns | 23.5380 ns | 22.0174 ns |
157+
// | BenchConvertTo | Integer | InteropInterface | 4,684.409 ns | 24.7033 ns | 21.8989 ns |
158+
// | BenchConvertTo | ByteString | Any | 5,833.857 ns | 20.1553 ns | 18.8533 ns |
159+
// | BenchConvertTo | ByteString | Pointer | 5,807.973 ns | 11.7754 ns | 10.4386 ns |
160+
// | BenchConvertTo | ByteString | Boolean | 33.007 ns | 0.1574 ns | 0.1472 ns |
161+
// | BenchConvertTo | ByteString | Integer | 23.622 ns | 0.0755 ns | 0.0669 ns |
162+
// | BenchConvertTo | ByteString | ByteString | 4.288 ns | 0.0152 ns | 0.0142 ns |
163+
// | BenchConvertTo | ByteString | Buffer | 24.881 ns | 0.0889 ns | 0.0788 ns |
164+
// | BenchConvertTo | ByteString | Array | 6,030.813 ns | 19.9562 ns | 18.6670 ns |
165+
// | BenchConvertTo | ByteString | Struct | 5,811.185 ns | 24.0781 ns | 22.5226 ns |
166+
// | BenchConvertTo | ByteString | Map | 5,866.820 ns | 17.0315 ns | 15.0980 ns |
167+
// | BenchConvertTo | ByteString | InteropInterface | 5,757.124 ns | 16.3184 ns | 14.4658 ns |
168+
// | BenchConvertTo | Buffer | Any | 4,886.279 ns | 17.1370 ns | 14.3102 ns |
169+
// | BenchConvertTo | Buffer | Pointer | 4,698.364 ns | 14.5491 ns | 12.1492 ns |
170+
// | BenchConvertTo | Buffer | Boolean | 6.130 ns | 0.0323 ns | 0.0302 ns |
171+
// | BenchConvertTo | Buffer | Integer | 4,645.764 ns | 15.8146 ns | 14.7930 ns |
172+
// | BenchConvertTo | Buffer | ByteString | 29.874 ns | 0.1518 ns | 0.1268 ns |
173+
// | BenchConvertTo | Buffer | Buffer | 4.939 ns | 0.0190 ns | 0.0178 ns |
174+
// | BenchConvertTo | Buffer | Array | 4,683.427 ns | 21.3813 ns | 20.0001 ns |
175+
// | BenchConvertTo | Buffer | Struct | 4,680.762 ns | 15.7220 ns | 13.9371 ns |
176+
// | BenchConvertTo | Buffer | Map | 4,706.510 ns | 14.2061 ns | 12.5934 ns |
177+
// | BenchConvertTo | Buffer | InteropInterface | 4,703.050 ns | 15.8002 ns | 14.0064 ns |
178+
// | BenchConvertTo | Array | Any | 4,652.710 ns | 23.2061 ns | 20.5716 ns |
179+
// | BenchConvertTo | Array | Pointer | 4,625.049 ns | 12.4455 ns | 11.6415 ns |
180+
// | BenchConvertTo | Array | Boolean | 5.568 ns | 0.0181 ns | 0.0169 ns |
181+
// | BenchConvertTo | Array | Integer | 4,659.897 ns | 19.8036 ns | 18.5243 ns |
182+
// | BenchConvertTo | Array | ByteString | 4,663.020 ns | 12.4988 ns | 11.6914 ns |
183+
// | BenchConvertTo | Array | Buffer | 4,680.281 ns | 14.9748 ns | 13.2748 ns |
184+
// | BenchConvertTo | Array | Array | 4.246 ns | 0.0124 ns | 0.0110 ns |
185+
// | BenchConvertTo | Array | Struct | 1,193.106 ns | 98.5374 ns | 285.8748 ns |
186+
// | BenchConvertTo | Array | Map | 4,742.631 ns | 35.5855 ns | 33.2867 ns |
187+
// | BenchConvertTo | Array | InteropInterface | 4,670.743 ns | 9.3547 ns | 7.8116 ns |
188+
// | BenchConvertTo | Struct | Any | 4,643.558 ns | 31.0451 ns | 29.0396 ns |
189+
// | BenchConvertTo | Struct | Pointer | 4,867.925 ns | 22.2347 ns | 19.7105 ns |
190+
// | BenchConvertTo | Struct | Boolean | 5.581 ns | 0.0251 ns | 0.0235 ns |
191+
// | BenchConvertTo | Struct | Integer | 4,653.442 ns | 17.7417 ns | 16.5956 ns |
192+
// | BenchConvertTo | Struct | ByteString | 4,646.242 ns | 13.7830 ns | 12.8926 ns |
193+
// | BenchConvertTo | Struct | Buffer | 4,776.205 ns | 14.1918 ns | 13.2751 ns |
194+
// | BenchConvertTo | Struct | Array | 1,622.573 ns | 144.8116 ns | 398.8532 ns |
195+
// | BenchConvertTo | Struct | Struct | 4.195 ns | 0.0327 ns | 0.0290 ns |
196+
// | BenchConvertTo | Struct | Map | 4,672.579 ns | 17.6257 ns | 16.4871 ns |
197+
// | BenchConvertTo | Struct | InteropInterface | 4,653.476 ns | 8.2047 ns | 7.6747 ns |
198+
// | BenchConvertTo | Map | Any | 4,676.540 ns | 15.2010 ns | 13.4753 ns |
199+
// | BenchConvertTo | Map | Pointer | 4,663.489 ns | 13.7871 ns | 12.2219 ns |
200+
// | BenchConvertTo | Map | Boolean | 5.535 ns | 0.0205 ns | 0.0192 ns |
201+
// | BenchConvertTo | Map | Integer | 4,661.275 ns | 12.4402 ns | 11.6366 ns |
202+
// | BenchConvertTo | Map | ByteString | 4,662.482 ns | 25.7111 ns | 24.0502 ns |
203+
// | BenchConvertTo | Map | Buffer | 4,859.809 ns | 18.2981 ns | 16.2208 ns |
204+
// | BenchConvertTo | Map | Array | 4,627.149 ns | 10.7487 ns | 9.5285 ns |
205+
// | BenchConvertTo | Map | Struct | 4,646.504 ns | 22.4190 ns | 20.9707 ns |
206+
// | BenchConvertTo | Map | Map | 4.160 ns | 0.0180 ns | 0.0169 ns |
207+
// | BenchConvertTo | Map | InteropInterface | 4,667.024 ns | 14.1790 ns | 13.2630 ns |
208+
// | BenchConvertTo | InteropInterface | Any | 4,700.511 ns | 17.4725 ns | 15.4889 ns |
209+
// | BenchConvertTo | InteropInterface | Pointer | 4,705.819 ns | 25.2035 ns | 23.5754 ns |
210+
// | BenchConvertTo | InteropInterface | Boolean | 5.557 ns | 0.0244 ns | 0.0228 ns |
211+
// | BenchConvertTo | InteropInterface | Integer | 4,695.410 ns | 21.8674 ns | 20.4547 ns |
212+
// | BenchConvertTo | InteropInterface | ByteString | 4,674.552 ns | 18.8705 ns | 17.6515 ns |
213+
// | BenchConvertTo | InteropInterface | Buffer | 4,649.237 ns | 23.9084 ns | 22.3639 ns |
214+
// | BenchConvertTo | InteropInterface | Array | 4,827.652 ns | 29.7153 ns | 27.7957 ns |
215+
// | BenchConvertTo | InteropInterface | Struct | 4,624.202 ns | 10.3563 ns | 8.0855 ns |
216+
// | BenchConvertTo | InteropInterface | Map | 4,695.310 ns | 23.1192 ns | 21.6257 ns |
217+
// | BenchConvertTo | InteropInterface | InteropInterface | 4.137 ns | 0.0156 ns | 0.0138 ns |

benchmarks/Neo.VM.Benchmarks/Benchmarks.Types.cs renamed to benchmarks/Neo.VM.Benchmarks/VMTypes/Benchmarks_DeepCopy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright (C) 2015-2024 The Neo Project.
22
//
3-
// Benchmarks.Types.cs file belongs to the neo project and is free
3+
// Benchmarks_DeepCopy.cs file belongs to the neo project and is free
44
// software distributed under the MIT software license, see the
55
// accompanying file LICENSE in the main directory of the
66
// repository or http://www.opensource.org/licenses/mit-license.php
@@ -14,7 +14,7 @@
1414

1515
namespace Neo.VM.Benchmark;
1616

17-
public class Benchmarks_Types
17+
public class Benchmarks_DeepCopy
1818
{
1919
public IEnumerable<(int Depth, int ElementsPerLevel)> ParamSource()
2020
{

0 commit comments

Comments
 (0)