|
| 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 | |
0 commit comments