テーマ「最適化 その2」

997 views

Published on

2010/09/11 @do-speakers#1
愛について語ります。

Published in: Business, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
997
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

テーマ「最適化 その2」

  1. 1. ライトニングトーク
  2. 2. 自己紹介 twitter: techno_neko 所属:Hokkaido.pm 仕事:組み込み系
  3. 3. テーマ「最適化」 We love optimize!
  4. 4. 前回までのあらすじ カラー画像をモノクロに変換する perl スクリプトの処理時間を 約 40% まで短縮したところ、 思わぬところからアドバイスと リクエストを頂いたのであった。
  5. 5. お題 「カラー画像をモノクロに変換」 変換!
  6. 6. モノクロに変換 カラー画像 モノクロ画像 ・ ・ ・ ・ ・ ・ Y = 0.29*R + 0.59*G + 0.11*B (※係数は、輝度を求める一般的な値) 0x004E4E4E 0x004E4E4E 0x12345678 0x004E4E4E 0x12345678 0x12345678
  7. 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. 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; }
  9. 9. モノクロに変換 TEST1: 24 wallclock secs (24.00 usr + 0.13 sys = 24.13 CPU) @ 0.04/s (n=1) これが基準タイム
  10. 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. 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)
  12. 12. use integer; を手に入れた! (すべてはここから始まった・・・)
  13. 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. 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. 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. 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. 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. 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)
  19. 19. まとめ
  20. 20. まとめ ・最適化とはロマン
  21. 21. まとめ ・最適化とはロマン ・自分との戦い
  22. 22. まとめ ・最適化とはロマン ・自分との戦い ・危険を伴う
  23. 23. 故に、 常に問い続けなければ ならない。 それは・・・、
  24. 24. 「そこに愛はあるのかい?」
  25. 25. 愛が止まらない ;)
  26. 26. ご清聴、ありがとうございました。

×