github.com/wasilibs/wazerox@v0.0.0-20240124024944-4923be63ab5f/internal/integration_test/vs/bench_memory.go (about) 1 package vs 2 3 import ( 4 _ "embed" 5 "encoding/binary" 6 "fmt" 7 "testing" 8 9 "github.com/wasilibs/wazerox/internal/testing/require" 10 ) 11 12 const ( 13 i32 = "i32" 14 i32ValueMemoryOffset = 32 15 i64 = "i64" 16 i64ValueMemoryOffset = 64 17 inWasmIteration = 100 18 ) 19 20 var ( 21 //go:embed testdata/memory.wasm 22 memoryWasm []byte 23 memoryConfig *RuntimeConfig 24 memoryFunctions = []string{i32, i64} 25 ) 26 27 func init() { 28 memoryConfig = &RuntimeConfig{ 29 ModuleName: "memory", 30 ModuleWasm: memoryWasm, 31 FuncNames: memoryFunctions, 32 NeedsMemoryExport: true, 33 } 34 } 35 36 func RunTestMemory(t *testing.T, runtime func() Runtime) { 37 t.Run(i32, func(t *testing.T) { 38 testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) { 39 buf := m.Memory() 40 binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration) 41 err := m.CallV_V(testCtx, i32) 42 require.NoError(t, err) 43 if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) { 44 panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]))) 45 } 46 }) 47 }) 48 49 t.Run(i64, func(t *testing.T) { 50 testCall(t, runtime, memoryConfig, func(t *testing.T, m Module, instantiation int, iteration int) { 51 buf := m.Memory() 52 binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration) 53 err := m.CallV_V(testCtx, i64) 54 require.NoError(t, err) 55 if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) { 56 panic(fmt.Sprintf("BUG at iteration %d: %d", iteration, binary.LittleEndian.Uint64(buf[i32ValueMemoryOffset:]))) 57 } 58 }) 59 }) 60 } 61 62 func RunTestBenchmarkMemory_CompilerFastest(t *testing.T, vsRuntime Runtime) { 63 t.Run(i32, func(t *testing.T) { 64 runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i32", memoryI32, vsRuntime) 65 }) 66 t.Run(i64, func(t *testing.T) { 67 runTestBenchmark_Call_CompilerFastest(t, memoryConfig, "/memory.i64", memoryI64, vsRuntime) 68 }) 69 } 70 71 func RunBenchmarkMemory(b *testing.B, runtime func() Runtime) { 72 b.Run(i32, func(b *testing.B) { 73 benchmark(b, runtime, memoryConfig, memoryI32) 74 }) 75 b.Run(i64, func(b *testing.B) { 76 benchmark(b, runtime, memoryConfig, memoryI64) 77 }) 78 } 79 80 func memoryI32(m Module, iteration int) (err error) { 81 buf := m.Memory() 82 binary.LittleEndian.PutUint32(buf[i32ValueMemoryOffset:], inWasmIteration) 83 err = m.CallV_V(testCtx, i32) 84 if 0 != binary.LittleEndian.Uint32(buf[i32ValueMemoryOffset:]) { 85 panic(fmt.Sprintf("BUG at iteration %d", iteration)) 86 } 87 return 88 } 89 90 func memoryI64(m Module, iteration int) (err error) { 91 buf := m.Memory() 92 binary.LittleEndian.PutUint64(buf[i64ValueMemoryOffset:], inWasmIteration) 93 err = m.CallV_V(testCtx, i64) 94 if 0 != binary.LittleEndian.Uint64(buf[i64ValueMemoryOffset:]) { 95 panic(fmt.Sprintf("BUG at iteration %d", iteration)) 96 } 97 return 98 }