Skip to content

Commit 6dc32e8

Browse files
holimanfjl
authored andcommitted
core/vm: add benchmarks for some ops and precompiles (ethereum#14641)
1 parent 9e5f03b commit 6dc32e8

File tree

1 file changed

+242
-0
lines changed

1 file changed

+242
-0
lines changed

core/vm/instructions_test.go

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package vm
22

33
import (
4+
"fmt"
45
"math/big"
56
"testing"
67

@@ -40,3 +41,244 @@ func TestByteOp(t *testing.T) {
4041
}
4142
}
4243
}
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

Comments
 (0)