Files
wazero/internal/integration_test/vs/bench_memory.go
Takeshi Yoneda 9d3260f94f vs: adds in-Wasm loop inside the memory bench (#768)
Signed-off-by: Takeshi Yoneda <takeshi@tetrate.io>
2022-08-26 14:49:14 +09:00

99 lines
2.8 KiB
Go

package vs
import (
_ "embed"
"encoding/binary"
"fmt"
"testing"
"github.com/tetratelabs/wazero/internal/testing/require"
)
const (
i32 = "i32"
i32ValueMemoryOffset = 32
i64 = "i64"
i64ValueMemoryOffset = 64
inWasmIteration = 100
)
var (
//go:embed testdata/memory.wasm
memoryWasm []byte
memoryConfig *RuntimeConfig
memoryFunctions = []string{i32, i64}
)
func init() {
memoryConfig = &RuntimeConfig{
ModuleName: "memory",
ModuleWasm: memoryWasm,
FuncNames: memoryFunctions,
NeedsMemoryExport: true,
}
}
func RunTestMemory(t *testing.T, runtime func() Runtime) {
t.Run(i32, func(t *testing.T) {
testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) {
buf := m.Memory()
binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration)
err := m.CallV_V(testCtx, i32)
require.NoError(t, err)
if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) {
panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:])))
}
})
})
t.Run(i64, func(t *testing.T) {
testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) {
buf := m.Memory()
binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration)
err := m.CallV_V(testCtx, i64)
require.NoError(t, err)
if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) {
panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint64(buf[i32ValueMemoryOffset:])))
}
})
})
}
func RunTestBenchmarkMemory_CompilerFastest(t *testing.T, vsRuntime Runtime) {
t.Run(i32, func(t *testing.T) {
runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i32", memoryI32, vsRuntime)
})
t.Run(i64, func(t *testing.T) {
runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i64", memoryI64, vsRuntime)
})
}
func RunBenchmarkMemory(b *testing.B, runtime func() Runtime) {
b.Run(i32, func(b *testing.B) {
benchmark(b, runtime, memoryConfig, memoryI32)
})
b.Run(i64, func(b *testing.B) {
benchmark(b, runtime, memoryConfig, memoryI64)
})
}
func memoryI32(m Module, iteration int) (err error) {
buf := m.Memory()
binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration)
err = m.CallV_V(testCtx, i32)
if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) {
panic(fmt.Sprintf("BUG at iteration %d", iteration))
}
return
}
func memoryI64(m Module, iteration int) (err error) {
buf := m.Memory()
binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration)
err = m.CallV_V(testCtx, i64)
if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) {
panic(fmt.Sprintf("BUG at iteration %d", iteration))
}
return
}