#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/05/01 21:10:23 +0900> """ ARGBからRGBAへの変換処理時間を測定 * Windows10 x64 21H2 + Python 2.7.18 32bit """ from benchmarker import Benchmarker import struct LOOP = 5 def create_src_data(): print("start.") rgba = [] w, h = 2048, 2048 r, g, b, a = 0, 32, 64, 128 for y in range(h): for x in range(w): rgba.append(struct.pack('4B', b, g, r, a)) r += 1 g += 1 b += 1 a += 1 if r > 255: r = 0 if g > 255: g = 0 if b > 255: b = 0 if a > 255: a = 0 src = ''.join(rgba) print("create source data.") return src def get_rgba_str_slow(src): buf = "" size = len(src) for i in range(size / 4): i0 = i * 4 i1 = i0 + 4 bgra = struct.unpack('=L', src[i0: i1])[0] a = (bgra >> 24) & 0x0ff r = (bgra >> 16) & 0x0ff g = (bgra >> 8) & 0x0ff b = bgra & 0x0ff rgba = struct.pack('4B', r, g, b, a) buf += rgba return buf def get_rgba_str(src): unpack = struct.Struct('=L').unpack_from pack = struct.Struct('>L').pack lmax = len(src) / 4 rgba = [None] * lmax for i in range(lmax): d = unpack(src, i * 4)[0] rgba[i] = pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff)) return ''.join(rgba) def get_rgba_str_b(src): unpack = struct.Struct('=L').unpack_from pack = struct.Struct('>L').pack lmax = len(src) / 4 rgba = [] for i in range(lmax): d = unpack(src, i * 4)[0] rgba.append(pack(((d & 0x00ffffff) << 8) | ((d >> 24) & 0x0ff))) return ''.join(rgba) def get_rgba_str_c(src): lmax = len(src) / 4 argb = list(struct.unpack("=%dL" % lmax, src)) spack = struct.Struct('>L').pack rgba = [None] * lmax for i, d in enumerate(argb): rgba[i] = spack(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)) return ''.join(rgba) def get_rgba_str_d(src): lmax = len(src) / 4 argb = list(struct.unpack("=%dL" % lmax, src)) rgba = [None] * lmax for i, d in enumerate(argb): rgba[i] = ((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff) return struct.pack(">%dL" % lmax, *rgba) def get_rgba_str_e(src): lmax = len(src) / 4 argb = list(struct.unpack("=%dL" % lmax, src)) rgba = [] for d in argb: rgba.append(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)) return struct.pack(">%dL" % lmax, *rgba) src = create_src_data() # dst0 = get_rgba_str_slow(src) # dst1 = get_rgba_str(src) # dst2 = get_rgba_str_b(src) # dst3 = get_rgba_str_c(src) # dst4 = get_rgba_str_d(src) # if dst1 == dst4: # print("Success") # else: # print("Failure") with Benchmarker(LOOP, width=20) as bench: @bench("argb split") def check_use_split(bm): get_rgba_str_slow(src) @bench("rgb shift A") def check_use_rgb_shift(bm): get_rgba_str(src) @bench("rgb shift B") def check_use_rgb_shift_b(bm): get_rgba_str_b(src) @bench("rgb shift C") def check_use_rgb_shift_c(bm): get_rgba_str_c(src) @bench("rgb shift D") def check_use_rgb_shift_d(bm): get_rgba_str_d(src) @bench("rgb shift E") def check_use_rgb_shift_e(bm): get_rgba_str_e(src)