From 2c2ccdca74a2c2f1bd63a51ca6eb97f2a368f0f4 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 2 Aug 2021 21:46:19 +0300 Subject: [PATCH] opcode: optimize IsValid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Map access costs much more than array access. name old time/op new time/op delta IsValid-8 17.6ns ± 2% 1.1ns ± 2% -93.68% (p=0.008 n=5+5) --- pkg/vm/opcode/isvalid_test.go | 15 +++++++++++++++ pkg/vm/opcode/opcode.go | 12 ++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 pkg/vm/opcode/isvalid_test.go diff --git a/pkg/vm/opcode/isvalid_test.go b/pkg/vm/opcode/isvalid_test.go new file mode 100644 index 000000000..2361c4ee8 --- /dev/null +++ b/pkg/vm/opcode/isvalid_test.go @@ -0,0 +1,15 @@ +package opcode + +import ( + "testing" +) + +// IsValid() is called for every VM instruction. +func BenchmarkIsValid(t *testing.B) { + // Just so that we don't always test the same opcode. + script := []Opcode{NOP, ADD, SYSCALL, APPEND, 0xff, 0xf0} + l := len(script) + for n := 0; n < t.N; n++ { + _ = IsValid(script[n%l]) + } +} diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index 3d24b7ea7..93b62e5cd 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -222,8 +222,16 @@ const ( CONVERT Opcode = 0xDB ) +var validCodes [256]bool + +func init() { + // We rely on stringer here, it has a map anyway. + for op := range _Opcode_map { + validCodes[int(op)] = true + } +} + // IsValid returns true if the opcode passed is valid (defined in the VM). func IsValid(op Opcode) bool { - _, ok := _Opcode_map[op] // We rely on stringer here, it has a map anyway. - return ok + return validCodes[int(op)] }