2017/04/17(月) [n年前の日記]
#1 [ruby] BGRAをARGBに変換するソレ
昨日書いたRubyスクリプトをもっと高速化できないものかとググってたら以下の記事を見かけて。
_Rubyでのビッグエンディアンとリトルエンディアンの相互変換 - エンジニアの低脳っぷりを晒す戦記
あー。その手があったか…。なるほどなあ…。
つまり、以下の処理は…。
こう書けるのだな…。
ベンチマークを取ってみたら、2倍ほど速くなった。
このやり方、何をやってるのかちょっと分かりづらい、ような気もする。せめてコメントをつけておかないと3週間後の自分が頭の上に「???」を浮かべてそう。
_Rubyでのビッグエンディアンとリトルエンディアンの相互変換 - エンジニアの低脳っぷりを晒す戦記
あー。その手があったか…。なるほどなあ…。
つまり、以下の処理は…。
def convert_image2(w, h, surface)
dst = []
src = surface.data.unpack("L*")
src.each do |d|
dst << ((d >> 24) & 0x0ff) # a
dst << ((d >> 16) & 0x0ff) # r
dst << ((d >> 8) & 0x0ff) # g
dst << (d & 0x0ff) # b
end
return Image.createFromArray(w, h, dst)
end
こう書けるのだな…。
def convert_image3(w, h, surface)
dst = surface.data.unpack("L*").pack("N*").unpack("C*")
return Image.createFromArray(w, h, dst)
end
ベンチマークを取ってみたら、2倍ほど速くなった。
ruby cairo_helloworld_dxruby3.rb
user system total real
cairo draw 0.031000 0.000000 0.031000 ( 0.020485)
use StringIO 0.047000 0.000000 0.047000 ( 0.046708)
not StringIO 0.203000 0.016000 0.219000 ( 0.224593)
unpack+pack 0.110000 0.000000 0.110000 ( 0.112492)
それでも、一旦png出力するほうが速いという結果に。無念。このやり方、何をやってるのかちょっと分かりづらい、ような気もする。せめてコメントをつけておかないと3週間後の自分が頭の上に「???」を浮かべてそう。
[ ツッコむ ]
以上、1 日分です。