Weitere ähnliche Inhalte
Ähnlich wie テーマ「最適化 その2」 (20)
テーマ「最適化 その2」
- 7. 実行環境
Mac OS X 10.6.4
CPU Intel Core 2 Duo 2.4 GHz
メモリ 4GB 800MHz DDR2 SDRAM
perl 5.12.1
テストデータ
6M pixel ( 3008 x 2000 )
32bit format
- 8. モノクロに変換
sub test1 {
# Y = 0.29*R + 0.59*G + 0.11*B
my @factor = ( 0.30, 0.59, 0.11 );
my @argb_test = @argb_src;
for (my $i=0; $i<scalar(@argb_test); $i++) {
my $argb = $argb_test[$i]; # ARGB
my $r = ( ($argb >> 16) & 0xFF );
my $g = ( ($argb >> 8) & 0xFF );
my $b = ( ($argb >> 0) & 0xFF );
my $y = int( ($r * $factor[0]) + ($g * $factor[1]) + ($b * $factor[2]) );
$argb_test[$i] = ( ($y << 16) + ($y << 8) + $y );
}
push @argb_dst, @argb_test;
}
- 10. モノクロに変換 〜 前回の最速
map の中を 1 行にまとめてみた
# Y = 0.29*R + 0.59*G + 0.11*B
my $fr = 0.30 / (1 << 16);
my $fg = 0.59 / (1 << 8);
my $fb = 0.11 / (1 << 0);
my @argb_test = map {
0x010101 * int(
(($_ & 0xFF0000) * $fr)
+ (($_ & 0x00FF00) * $fg)
+ (($_ & 0x0000FF) * $fb)
);
} @argb_src;
- 11. モノクロに変換 〜 前回の最速
約 234% 高速化!
TEST7: 11 wallclock secs
(10.04 usr + 0.28 sys =
10.32 CPU) @ 0.10/s (n=1)
TEST1: 24 wallclock secs
(24.00 usr + 0.13 sys =
24.13 CPU) @ 0.04/s (n=1)
- 13. モノクロに変換 〜 その1
use integer;
# Y = 0.29*R + 0.59*G + 0.11*B
my $fr = (30 * 256) / 100;
my $fg = (59 * 256) / 100;
my $fb = 256 - $fr - $fg; #(11 * 256) / 100;
my @argb_test = map {
0x010101 * (
(
( (($_ >> 16) & 0xFF) * $fr )
+ ( (($_ >> 8) & 0xFF) * $fg )
+ ( (($_ >> 0) & 0xFF) * $fb )
) >> 8
);
} @argb_src;
- 14. モノクロに変換 〜 その1
約 269% 高速化!
TEST8: 9 wallclock secs
( 8.88 usr + 0.10 sys =
8.98 CPU) @ 0.11/s (n=1)
TEST1: 24 wallclock secs
(24.00 usr + 0.13 sys =
24.13 CPU) @ 0.04/s (n=1)
- 15. モノクロに変換 〜 その2
use integer;
# Y = 0.29*R + 0.59*G + 0.11*B
my $fr = (30 * 256) / 100;
my $fg = (59 * 256) / 100;
my $fb = 256 - $fr - $fg; #(11 * 256) / 100;
$fb <<= 8; # only B
my @argb_test = map {
0x010101 * (
(
( (($_ >> 8) & 0xFF00) * $fr )
+ ( ( $_ & 0xFF00) * $fg )
+ ( ( $_ & 0x00FF) * $fb ) # $fb is already "<< 8"
) >> 16
);
} @argb_src;
- 16. モノクロに変換 〜 その2
約 317% 削減!
TEST9: 7 wallclock secs
( 7.52 usr + 0.10 sys =
7.62 CPU) @ 0.13/s (n=1)
TEST1: 24 wallclock secs
(24.00 usr + 0.13 sys =
24.13 CPU) @ 0.04/s (n=1)
- 17. モノクロに変換 〜 最終章
use integer;
# Y = 0.29*R + 0.59*G + 0.11*B
my $fr = (30 * 128) / 100;
my $fg = (59 * 128) / 100;
my $fb = 128 - $fr - $fg; #(11 * 128) / 100;
$fg <<= 8;
$fb <<= 16;
my @argb_test = map {
0x010101 * (
(
( ( $_ & 0xFF0000) * $fr )
+ ( ( $_ & 0x00FF00) * $fg )
+ ( ( $_ & 0x0000FF) * $fb )
) >> 23 #(24 - 1)
);
} @argb_src;
- 18. モノクロに変換 〜 最終章
約 355% 高速化!
TESTA: 7 wallclock secs
( 6.69 usr + 0.11 sys =
6.80 CPU) @ 0.15/s (n=1)
TEST1: 24 wallclock secs
(24.00 usr + 0.13 sys =
24.13 CPU) @ 0.04/s (n=1)