|
1 | 1 | package vm
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "fmt" |
4 | 5 | "math/big"
|
5 | 6 | "testing"
|
6 | 7 |
|
@@ -40,3 +41,244 @@ func TestByteOp(t *testing.T) {
|
40 | 41 | }
|
41 | 42 | }
|
42 | 43 | }
|
| 44 | + |
| 45 | +func opBenchmark(bench *testing.B, op func(pc *uint64, evm *EVM, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) { |
| 46 | + var ( |
| 47 | + env = NewEVM(Context{}, nil, params.TestChainConfig, Config{EnableJit: false, ForceJit: false}) |
| 48 | + stack = newstack() |
| 49 | + ) |
| 50 | + // convert args |
| 51 | + byteArgs := make([][]byte, len(args)) |
| 52 | + for i, arg := range args { |
| 53 | + byteArgs[i] = common.Hex2Bytes(arg) |
| 54 | + } |
| 55 | + pc := uint64(0) |
| 56 | + bench.ResetTimer() |
| 57 | + for i := 0; i < bench.N; i++ { |
| 58 | + for _, arg := range byteArgs { |
| 59 | + a := new(big.Int).SetBytes(arg) |
| 60 | + stack.push(a) |
| 61 | + } |
| 62 | + op(&pc, env, nil, nil, stack) |
| 63 | + stack.pop() |
| 64 | + } |
| 65 | +} |
| 66 | + |
| 67 | +func precompiledBenchmark(addr, input, expected string, gas uint64, bench *testing.B) { |
| 68 | + |
| 69 | + contract := NewContract(AccountRef(common.HexToAddress("1337")), |
| 70 | + nil, new(big.Int), gas) |
| 71 | + |
| 72 | + p := PrecompiledContracts[common.HexToAddress(addr)] |
| 73 | + in := common.Hex2Bytes(input) |
| 74 | + var ( |
| 75 | + res []byte |
| 76 | + err error |
| 77 | + ) |
| 78 | + data := make([]byte, len(in)) |
| 79 | + bench.ResetTimer() |
| 80 | + for i := 0; i < bench.N; i++ { |
| 81 | + contract.Gas = gas |
| 82 | + copy(data, in) |
| 83 | + res, err = RunPrecompiledContract(p, data, contract) |
| 84 | + } |
| 85 | + bench.StopTimer() |
| 86 | + //Check if it is correct |
| 87 | + if err != nil { |
| 88 | + bench.Error(err) |
| 89 | + return |
| 90 | + } |
| 91 | + if common.Bytes2Hex(res) != expected { |
| 92 | + bench.Error(fmt.Sprintf("Expected %v, got %v", expected, common.Bytes2Hex(res))) |
| 93 | + return |
| 94 | + } |
| 95 | +} |
| 96 | + |
| 97 | +func BenchmarkPrecompiledEcdsa(bench *testing.B) { |
| 98 | + var ( |
| 99 | + addr = "01" |
| 100 | + inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" |
| 101 | + exp = "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d" |
| 102 | + gas = uint64(4000000) |
| 103 | + ) |
| 104 | + precompiledBenchmark(addr, inp, exp, gas, bench) |
| 105 | +} |
| 106 | +func BenchmarkPrecompiledSha256(bench *testing.B) { |
| 107 | + var ( |
| 108 | + addr = "02" |
| 109 | + inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" |
| 110 | + exp = "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d" |
| 111 | + gas = uint64(4000000) |
| 112 | + ) |
| 113 | + precompiledBenchmark(addr, inp, exp, gas, bench) |
| 114 | +} |
| 115 | +func BenchmarkPrecompiledRipeMD(bench *testing.B) { |
| 116 | + var ( |
| 117 | + addr = "03" |
| 118 | + inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" |
| 119 | + exp = "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6" |
| 120 | + gas = uint64(4000000) |
| 121 | + ) |
| 122 | + precompiledBenchmark(addr, inp, exp, gas, bench) |
| 123 | +} |
| 124 | +func BenchmarkPrecompiledIdentity(bench *testing.B) { |
| 125 | + var ( |
| 126 | + addr = "04" |
| 127 | + inp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" |
| 128 | + exp = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02" |
| 129 | + gas = uint64(4000000) |
| 130 | + ) |
| 131 | + precompiledBenchmark(addr, inp, exp, gas, bench) |
| 132 | +} |
| 133 | +func BenchmarkOpAdd(b *testing.B) { |
| 134 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 135 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 136 | + |
| 137 | + opBenchmark(b, opAdd, x, y) |
| 138 | + |
| 139 | +} |
| 140 | +func BenchmarkOpSub(b *testing.B) { |
| 141 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 142 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 143 | + |
| 144 | + opBenchmark(b, opSub, x, y) |
| 145 | + |
| 146 | +} |
| 147 | +func BenchmarkOpMul(b *testing.B) { |
| 148 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 149 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 150 | + |
| 151 | + opBenchmark(b, opMul, x, y) |
| 152 | + |
| 153 | +} |
| 154 | +func BenchmarkOpDiv(b *testing.B) { |
| 155 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 156 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 157 | + |
| 158 | + opBenchmark(b, opDiv, x, y) |
| 159 | + |
| 160 | +} |
| 161 | +func BenchmarkOpSdiv(b *testing.B) { |
| 162 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 163 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 164 | + |
| 165 | + opBenchmark(b, opSdiv, x, y) |
| 166 | + |
| 167 | +} |
| 168 | +func BenchmarkOpMod(b *testing.B) { |
| 169 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 170 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 171 | + |
| 172 | + opBenchmark(b, opMod, x, y) |
| 173 | + |
| 174 | +} |
| 175 | +func BenchmarkOpSmod(b *testing.B) { |
| 176 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 177 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 178 | + |
| 179 | + opBenchmark(b, opSmod, x, y) |
| 180 | + |
| 181 | +} |
| 182 | +func BenchmarkOpExp(b *testing.B) { |
| 183 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 184 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 185 | + |
| 186 | + opBenchmark(b, opExp, x, y) |
| 187 | + |
| 188 | +} |
| 189 | +func BenchmarkOpSignExtend(b *testing.B) { |
| 190 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 191 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 192 | + |
| 193 | + opBenchmark(b, opSignExtend, x, y) |
| 194 | + |
| 195 | +} |
| 196 | +func BenchmarkOpLt(b *testing.B) { |
| 197 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 198 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 199 | + |
| 200 | + opBenchmark(b, opLt, x, y) |
| 201 | + |
| 202 | +} |
| 203 | +func BenchmarkOpGt(b *testing.B) { |
| 204 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 205 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 206 | + |
| 207 | + opBenchmark(b, opGt, x, y) |
| 208 | + |
| 209 | +} |
| 210 | +func BenchmarkOpSlt(b *testing.B) { |
| 211 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 212 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 213 | + |
| 214 | + opBenchmark(b, opSlt, x, y) |
| 215 | + |
| 216 | +} |
| 217 | +func BenchmarkOpSgt(b *testing.B) { |
| 218 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 219 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 220 | + |
| 221 | + opBenchmark(b, opSgt, x, y) |
| 222 | + |
| 223 | +} |
| 224 | +func BenchmarkOpEq(b *testing.B) { |
| 225 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 226 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 227 | + |
| 228 | + opBenchmark(b, opEq, x, y) |
| 229 | + |
| 230 | +} |
| 231 | +func BenchmarkOpAnd(b *testing.B) { |
| 232 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 233 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 234 | + |
| 235 | + opBenchmark(b, opAnd, x, y) |
| 236 | + |
| 237 | +} |
| 238 | +func BenchmarkOpOr(b *testing.B) { |
| 239 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 240 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 241 | + |
| 242 | + opBenchmark(b, opOr, x, y) |
| 243 | + |
| 244 | +} |
| 245 | +func BenchmarkOpXor(b *testing.B) { |
| 246 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 247 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 248 | + |
| 249 | + opBenchmark(b, opXor, x, y) |
| 250 | + |
| 251 | +} |
| 252 | +func BenchmarkOpByte(b *testing.B) { |
| 253 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 254 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 255 | + |
| 256 | + opBenchmark(b, opByte, x, y) |
| 257 | + |
| 258 | +} |
| 259 | + |
| 260 | +func BenchmarkOpAddmod(b *testing.B) { |
| 261 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 262 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 263 | + z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 264 | + |
| 265 | + opBenchmark(b, opAddmod, x, y, z) |
| 266 | + |
| 267 | +} |
| 268 | +func BenchmarkOpMulmod(b *testing.B) { |
| 269 | + x := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 270 | + y := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 271 | + z := "ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff" |
| 272 | + |
| 273 | + opBenchmark(b, opMulmod, x, y, z) |
| 274 | + |
| 275 | +} |
| 276 | + |
| 277 | +//func BenchmarkOpSha3(b *testing.B) { |
| 278 | +// x := "0" |
| 279 | +// y := "32" |
| 280 | +// |
| 281 | +// opBenchmark(b,opSha3, x, y) |
| 282 | +// |
| 283 | +// |
| 284 | +//} |
0 commit comments