#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/05/19 20:23:10 +0900> """ ARGBからRGBAへの変換処理時間を測定 * Windows10 x64 21H2 + Python 2.7.18 32bit """ from benchmarker import Benchmarker import struct import sys 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) def get_rgba_str_f(src): lmax = len(src) / 4 argb = list(struct.unpack("=%dL" % lmax, src)) rgba = [(((d & 0x0ffffff) << 8) | ((d >> 24) & 0x0ff)) for d in argb] return struct.pack(">%dL" % lmax, *rgba) def get_rgba_str_g(src): lmax = len(src) / 4 argb = list(struct.unpack("=%dL" % lmax, src)) rgba = [(((d & 0x0ffffff) << 8) + ((d >> 24) & 0x0ff)) for d in argb] return struct.pack(">%dL" % lmax, *rgba) def get_rgba_str_h(src): dst = list(src) if sys.byteorder == "little": for i in range(0, len(src), 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3] else: for i in range(0, len(src), 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i] return ''.join(dst) def get_rgba_str_i(src): dst = list(src) if sys.byteorder == "little": for i in range(0, len(src), 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3] else: for i in range(0, len(src), 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i] return struct.pack("%dc" % len(src), *dst) def get_rgba_str_j(src): cnt = len(src) dst = bytearray(cnt) if sys.byteorder == "little": for i in range(0, cnt, 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 2], src[i + 1], src[i], src[i + 3] else: for i in range(0, cnt, 4): dst[i], dst[i + 1], dst[i + 2], dst[i + 3] = src[i + 1], src[i + 2], src[i + 3], src[i] return dst def check_result(src): print("compare") dst = [] dst.append(get_rgba_str(src)) dst.append(get_rgba_str_slow(src)) dst.append(get_rgba_str_b(src)) dst.append(get_rgba_str_c(src)) dst.append(get_rgba_str_d(src)) dst.append(get_rgba_str_e(src)) dst.append(get_rgba_str_f(src)) dst.append(get_rgba_str_g(src)) dst.append(get_rgba_str_h(src)) dst.append(get_rgba_str_i(src)) dst.append(get_rgba_str_j(src)) for i in range(1, len(dst)): if dst[0] == dst[i]: print("Success [%d]" % i) else: print("Failure [%d]" % i) src = create_src_data() if False: # compare result data check_result(src) sys.exit() 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) # @bench("rgb shift F") # def check_use_rgb_shift_f(bm): # get_rgba_str_f(src) @bench("rgb shift G") def check_use_rgb_shift_g(bm): get_rgba_str_g(src) @bench("rgb shift H") def check_use_rgb_shift_h(bm): get_rgba_str_h(src) @bench("rgb shift I") def check_use_rgb_shift_i(bm): get_rgba_str_i(src) @bench("rgb shift J") def check_use_rgb_shift_j(bm): get_rgba_str_j(src)