#!/micropython # vim: fileencoding=utf-8: ts=4: sw=4: expandtab: from sys import implementation as impl from machine import freq as cpufreq from time import ticks_us,ticks_diff KILO = const(1_000) MEGA = const(1_000_000) CPUFREQ = const(240*MEGA) # SIZE = const(116*KILO) # max. for RP2040 SIZE = const(242*KILO) # max. for RP2350 # SIZE = const(900*KILO) # ~ for an ESP with 2MiB PSRAM @micropython.viper def memcpyB(src: ptr8, dest: ptr8, size:int): idx: int = size while (idx:=idx-1) >= 0: dest[idx] = src[idx] @micropython.viper def memcpyHW(src: ptr16, dest: ptr16, size:int): idx: int = size//2 while (idx:=idx-1) >= 0: dest[idx] = src[idx] @micropython.viper def memcpyW(src: ptr32, dest: ptr32, size:int): idx: int = size//4 while (idx:=idx-1) >= 0: dest[idx] = src[idx] # @micropython.asm_thumb # def memcpyAsm(r0,r1,r2): # src: ptr32, dest: ptr32, size:int): # sub (r2,r2,4) # label (loop) # data (2,0b0101100010000011) #2 ldr (r3, [r0,r2]) # data (2,0b0101000010001011) #2 str (r3, [r1,r2]) # sub (r2,r2,4) #1 # bpl (loop) #2/1 def test(): normfreq = cpufreq() cpufreq(CPUFREQ) t0 = ticks_us() ba1 = bytearray(SIZE) ba2 = bytearray(SIZE) t1 = ticks_us() memcpyB(ba1, ba2, SIZE) t2 = ticks_us() memcpyHW(ba1, ba2, SIZE) t3 = ticks_us() memcpyW(ba1, ba2, SIZE) t4 = ticks_us() # memcpyAsm(ba1, ba2, SIZE) t5 = ticks_us() td2 = ticks_diff(t2,t1) td3 = ticks_diff(t3,t2) td4 = ticks_diff(t4,t3) # td5 = ticks_diff(t5,t4) print(f'CPU: {impl[2]} @ {cpufreq()/MEGA} MHz') # CPU: Raspberry Pi Pico2 with RP2350 @ 240.0 MHz print(f'alloc: {ticks_diff(t1,t0):6} µs') # alloc: 2286 µs print(f'BYTE: {td2:6} µs {SIZE/td2:6.1f} MB/s') # BYTE: 25019 µs 9.6 MB/s print(f'HALF: {td3:6} µs {SIZE/td3:6.1f} MB/s') # HALF: 13508 µs 17.8 MB/s print(f'WORD: {td4:6} µs {SIZE/td4:6.1f} MB/s') # WORD: 6758 µs 35.5 MB/s # print(f'WORDasm:{td5:6} µs {SIZE/td5:6.1f} MB/s') # WORDasm: 1772 µs 187.8 MB/s cpufreq(normfreq) test()