#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/05/20 07:10:19 +0900> """ ARGBからRGBAへの変換処理時間を測定。Python 3 のみで動作。 * Windows10 x64 21H2 + Python 3.9.12 64bit """ from benchmarker import Benchmarker import struct import sys # check_data_enable = True check_data_enable = False LOOP = 5 if sys.version_info.major != 3: print("This script is compatible only with Python3.") sys.exit() def create_src_data(): print("start.") r, g, b, a = 0, 1, 2, 3 w, h = 2048, 2048 rgba = bytearray(w * h * 4) for i in range(0, len(rgba), 4): rgba[i], rgba[i + 1], rgba[i + 2], rgba[i + 3] = b, g, r, a src = rgba print("create source data. %d byte" % len(src)) # for i in range(8): # print(src[i]) return src 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_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_g(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 check_data_enable: # compare result data check_result(src) sys.exit() with Benchmarker(LOOP, width=20) as bench: @bench("rgb shift G") def check_use_rgb_shift_g(bm): get_rgba_str_g(src) @bench("rgb shift J") def check_use_rgb_shift_j(bm): get_rgba_str_j(src)