GIMPのPython-Fuで実行時間を計測

コンピュータ
GIMPで個人的によく使う処理をスクリプト化し、その処理時間を計測、比較することで最適なPCを探すことが目的

スクリプトで実行している内容

  • 画像の新規作成 7680×4320
  • 矩形選択塗りつぶし
  • ピクセル単位で塗りつぶし
  • 選択ガウスぼかし
  • 縮小・拡大(CUBIC)
  • PNG形式で画像を保存

結果

プロセッサ 新規作成

矩形塗

ピクセル塗

ガウスぼかし

縮小拡大

PNG保存

トータル時間(秒)
Intel Celeron 3965U(Win10) 0.34 0.35 2.40 3.64 17.06 3.06 26.50
Intel Celeron N5105(Win11) 0.30 0.43 1.92 0.89 5.70 3.2 12.00
AMD Ryzen7 5700X(1スレッド)(Win11)RTX5060Ti 16GB 0.42 0.24 1.05 1.25 6.00 1.58 10.32
AMD Ryzen5 5600X(1スレッドSMT Off)(Win11)RTX3070 0.17 0.37 1.19 1.04 5.63 1.38 9.40
AMD Ryzen5 5600X(1スレッド)(Win11)RTX3070 0.15 0.33 1.12 1.03 5.67 1.37 9.34
Intel Core i3 9100F(Ubuntu)RTX3060 0.27 0.47 1.68 0.63 3.05 1.96 7.58
Intel Celeron G6900(2スレッド)(Win11) GTX1630 0.13 0.44 1.47 0.76 3.34 1.61 7.32
AMD Ryzen5 5600X(12スレッド)(Win11)RTX3070 0.12 0.39 1.46 0.34 3.19 1.57 6.68
Intel Pentium Gold G7400(4スレッド)(Win11) GTX1630 0.16 0.49 1.34 0.64 2.27 1.50 6.32
AMD Ryzen5 5600X(Ubuntu)RTX3070 0.14 0.41 1.81 0.38 1.68 1.88 5.88
AMD Ryzen5 5600X(WSL-Ubuntu)RTX3070 0.06 0.82 1.82 0.33 1.51 1.82 5.53
AMD Ryzen5 5600G(Win11)(Mem16GBVRAM16GB) 0.13 0.30 1.20 0.49 1.63 1.50 4.95
AMD Ryzen7 5700X(Win11)RTX4070 0.15 0.44 1.47 0.29 1.39 1.41 4.7
AMD Ryzen5 5600G(Ubuntu)(Mem16GBVRAM16GB) 0.05 0.56 1.40 0.24 1.44 1.54 4.67
AMD Ryzen5 5600X(6スレッドSMT Off)(Win11)RTX3070 0.06 0.37 1.32 0.24 1.52 1.34 4.49
AMD Ryzen7 5700X(8スレッド)(Win11)RTX5060Ti 16GB 0.28 0.22 1.02 0.25 1.37 1.45 4.41
AMD Ryzen7 5700X(8スレッドSMT Off)(Win11)RTX4070 0.16 0.39 1.26 0.21 1.31 1.42 4.38
AMD Ryzen7 5700X(16スレッド)(Win11)RTX5060Ti 16GB 0.28 0.25 1.07 0.28 1.28 1.45 4.37
AMD Ryzen5 7600(Ubuntu)RTX3060 0.09 0.59 1.15 0.24 1.03 1.13 3.66
なぜかCore i3 9100Fがトータル一番速い結果になりました。各項目別にみてもPNGの書き出しが遅いですが、これはストレージが違うためだと考えられます。
スクリプトの作りに問題があるのかもしれませんが、以前からUbuntu上のGIMPの動きがキビキビしていると感じていたので個人的には納得の結果。
これの要因がIntel Core i3が速いのかOSがUbuntuのおかげなのか気になるところ。個人的には後者だとおもうのですが、そのうち確認してみたいと思います。
追記、Ryzen5 5600XのPCにUbuntu22.04をインストールしスクリプトを試したところCore i3 9100Fを超える速度が出ました。ということでGIMPはWindows版とLinux版で結構速度差があることが確認できました。
追記2、Ryzen5 5600X(Win11)GIMPの設定でスレッド数が1になっていました。こちらを12にセットしたところ処理時間がだいぶ短縮しました。
RyzenのSMTを無効化したらGIMPの動作が良くなった。
AMDのRyzen5 5600Xを搭載したPCでWindows版のGIMP2.10を使っているのですが、重いフィルターや大き目の画像の縮小などをすると、フリーズすることがありました。解決策としては、GIMPのメニュー→「編集」→「設定」→「...
追記3、SMTをOFFにしてGIMPの設定でスレッド数を半分の6(=CPUのコア数)にセットしたところ、さらに処理時間が短縮しました。トータル処理時間が最も短い設定が見つかりました。
追記20230925、Celeron G6900を追加Core i3 9100F(Ubuntu)を再計測。G6900の方がトータル速度が若干速い結果になりましたが、ほぼ互角といった感じです。「拡大縮小」や「ガウスぼかし」がマルチスレッド性能が効いてi3-9100Fのスコアが若干良いですが、それ以外は同じかG6900が若干上回った感じです。
追記20231003、Pentium G7400を追加、なんとなくAMDよりIntel系のプロセッサの方が向いていいる感じがします。
追記20231223、Win11のWSLでUbuntuをインストールし、そちらにFlatpackでインストールしたGIMPで計測した結果を追加。SMT OFFのWin11よりは遅いですが素のUbuntuより速い結果になりました。不思議な結果になりましたが、実際GIMPを使ってみると、体感動作が速い感じがします。インターフェイスのフォントサイズや日本語入力に難があったり、偶に落ちたりして安定感にも難がありますが、Windows版の代わりにしばらく使ってみたいと思います。
追記20240202 Ryzen5 5600G搭載のDeskMini X300で計測
追記20240223 Ryzen7 5700Xで計測してみましたが、5600Xと同様にSMTをOFFにして使用するスレッド数を8にセットしたセッティングがベストスコアになりました。
追記20240504 RTX5060Tiで計測してみました。矩形選択塗潰しとピクセル塗潰しの最速をマークしたことからグラボの世代が新しいと塗りつぶし性能が向上するみたい
あと、CPUのリアルコア数と利用するスレッド数を合わせると、ガウスぼかしと縮小拡大性能が向上することからCPUのマルチスレッド性能の影響が大きいと思われる。

スクリプト

#!/usr/bin/env python
# coding: utf8
from gimpfu import *
from array import array
from time import time
import os, glob
import platform, tempfile
def plugin_main():
    msg = ""
    msg = "Speed Test {0} {1}".format(platform.system(), platform.processor())
    ver = gimp.version
    msg += "\n" + "GIMP {0}.{1}.{2}".format(ver[0], ver[1], ver[2])
    start1 = time()
    # 新規作成
    width = 7680
    height = 4320
    image = pdb.gimp_image_new(width, height, 0)
    layer = pdb.gimp_layer_new(image, width, height, 1, "Background", 100, 0)
    image.add_layer(layer)
    color = (255, 255, 255, 1.0)
    pdb.gimp_context_set_foreground(color)
    pdb.gimp_drawable_edit_fill(layer, 0)
    disp = pdb.gimp_display_new(image)
    start2 = time()
    msg += "\n" + "新規作成:{0}".format(start2-start1)
    # 矩形選択塗りつぶし
    color = (255, 0, 0, 1.0)
    pdb.gimp_context_set_foreground(color)
    pdb.gimp_image_select_rectangle(image, 0, 1920, 1080, 1920, 1080)
    pdb.gimp_drawable_edit_fill(layer, 0)
    pdb.gimp_selection_none(image)
    start3 = time()
    msg += "\n" + "矩形選択塗潰し:{0}".format(start3-start2)
    pdb.gimp_image_select_rectangle(image, 0, 0, 0, 1920, 1080)
    # ピクセル単位塗りつぶし
    w = 1920
    h = 1080
    src_rgn = layer.get_pixel_rgn(0, 0, w, h, False, False)
    dst_rgn = layer.get_pixel_rgn(0, 0, w, h, False, True)
    src_pixels = array("B", src_rgn[0:w, 0:h])
    pixel_size = len(src_rgn[0,0])
    dest_pixels = array("B", "\x00" * (w * h * pixel_size))
    # 範囲選択水平ループ
    for x in range(0, w):
        # 範囲選択垂直ループ
        for y in range(0, h):
            pos = (x + w * y) * pixel_size
            val = src_pixels[pos: pos + pixel_size]
            val[0] = 0
            val[1] = 0
            val[2] = 255
            val[3] = 255
            dest_pixels[pos : pos + pixel_size] = val
    dst_rgn[0:w, 0:h] = dest_pixels.tostring()
    layer.flush()
    layer.merge_shadow()
    layer.update(0, 0, width, height)
    pdb.gimp_selection_none(image)
    start3 = time()
    msg += "\n" + "ピクセル塗潰し:{0}".format(start3-start2)
    total_time = time() - start1
    # 選択ガウスぼかし
    pdb.gimp_image_select_rectangle(image, 0, 960, 540, 1920, 1080)
    pdb.plug_in_sel_gauss(image, image.active_drawable, 5.0, 51)
    pdb.gimp_selection_none(image)
    start4 = time()
    msg += "\n" + "選択ガウスぼかし:{0}".format(start4-start3)
    # 縮小拡大
    pdb.gimp_image_scale_full(image, 1920, 1080, 2)
    pdb.gimp_image_scale_full(image, 7680, 4320, 2)
    start5 = time()
    msg += "\n" + "縮小拡大:{0}".format(start5-start4)
    # PNG保存
    tempfile.gettempdir()
    d = os.path.join(tempfile.gettempdir(), "temp.png")
    pdb.gimp_file_save(image, image.active_layer, d, d)
    start6 = time()
    msg += "\n" + "PNG保存:{0}".format(start6-start5)
    total_time = time() - start1
    msg += "\n" + "トータル:{0}".format(total_time)
    gimp.message(msg)
    os.remove(d)
    #pdb.gimp_display_delete(disp)
    return
register("SpeedTest", "", "", "", "", "",
    "SpeedTest", 
    "",
    [],
    [],
    plugin_main,
    menu = "<Image>/Filters")
main()

実行イメージ

感想

一般的なベンチマークソフトの結果は、自分が組んだPCで実行したスコアと比べて正常に動作しているかの指標として使っており、ゲーム性能をはかるベンチマークソフトが多い中、ゲームをしない人間にとっては、それほど心惹かれることはありませんでした。今回のスクリプトをいくつかのPCで設定を変えて実施したところ精度にばらつきはありますが、それなりに異なる結果が出てきて中々面白いと感じました。特に日々使っているGIMPの作業が早くなったり遅くなったりすることが可視化されることで、PCパーツをアップデートしたらどのような結果になるかと妄想が膨らみます。特にIntel系のCPUはノートパソコンだったり低消費電力モデルだったりと、スペック的に物足りないプロセッサばかりで、これが現行に近いミドルクラスのCPUで実行した場合どのような結果になるか興味が引かれます。

コメント