ことの発端は
・とある iso イメージのチェックサムが sha512 のものしか書かれてない
・sha512 に対応しているコマンドがない
(md5deep は hash, md5, sha1, sha256, tiger, whirlpool 、openssl は dgst, md5, md4, md2, sha1, mdc2, ripemd160)
NetBSD の digest が MacPorts にあればそれで済むのだけど、無い。
後で分かったけど、 gpg --print-md sha512 [filename] でできるなこれ・・・
・ruby でちょいと書けばよさそう
ちょちょいとぐぐって
Digest::SHA512 - Rubyリファレンスマニュアル
と
Digest::Base - Rubyリファレンスマニュアル
を参考にした後、ひとまず目的は達成。
ふと 自分でインストールした Ruby と OS付属のとで time をとってみたところ、どうにも自分で入れたのが遅い。以下の通り。
順に OS付属、MacPorts、自分で入れたもの
・バージョン
% /usr/bin/ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
% /opt/local/bin/ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10]
% ~/local/bin/ruby --version
ruby 1.8.7 (2009-12-24 patchlevel 248) [x86_64-darwin10.2.0]
・バイナリ具合を file で確認
% file /usr/bin/ruby
/usr/bin/ruby: Mach-O universal binary with 3 architectures
/usr/bin/ruby (for architecture x86_64): Mach-O 64-bit executable x86_64
/usr/bin/ruby (for architecture i386): Mach-O executable i386
/usr/bin/ruby (for architecture ppc7400): Mach-O executable ppc
% file /opt/local/bin/ruby
/opt/local/bin/ruby: Mach-O 64-bit executable x86_64
% file ~/local/bin/ruby
/Users/katsuji/local/bin/ruby: Mach-O 64-bit executable x86_64
・500M のファイルを用意して、sha512 チェックサムをとってみたときの time 結果
1回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.85s user 0.45s system 99% cpu 5.297 total
% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.75s user 0.43s system 99% cpu 5.185 total
% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 9.78s user 0.52s system 96% cpu 10.717 total
2回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.84s user 0.44s system 99% cpu 5.287 total
% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.75s user 0.44s system 99% cpu 5.205 total
% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 9.79s user 0.52s system 96% cpu 10.637 total
んー、倍くらい遅い。。。1.8.7-p174 も手で入れてみて計ってみようか・・・。
1.8.7-p174 、やっぱり遅い。
% ~/local/ruby18-p174/bin/ruby --version
ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-darwin10.2.0]
% time ~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null 9.66s user 0.45s system 99% cpu 10.116 total
% time ~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174/bin/ruby =sha512.rb ~/testfile > /dev/null 9.67s user 0.46s system 99% cpu 10.211 total
ということは MacPorts のパッチ当てるとよい?
1.8.7-p174 を MacPorts のパッチあてて入れたのでリトライ。相変わらず遅い。
% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 9.71s user 0.44s system 99% cpu 10.183 total
% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 9.71s user 0.44s system 99% cpu 10.167 total
configure のオプション等がよろしくないのか?
見直しし判明。最適化だった模様。
前述の 1.8.7-p174 + MacPorts のパッチに加え、 CFLAGS に -O2 を追加したバイナリの場合↓
% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 4.72s user 0.44s system 99% cpu 5.172 total
% time ~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null
~/local/ruby18-p174-patched/bin/ruby =sha512.rb ~/testfile > /dev/null 4.73s user 0.44s system 98% cpu 5.223 total
追記4:
というわけで 1.8.7-p248 を入れ直して OS付属の、MacPortsのとともに追試
入れ直しついでに、-O2 でなくてアグレッシブに -O3 にした。
MacPorts でのパッチは p174 のものがそのままでは p248 で使えないだろうと思ったので当ててない。
1回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.82s user 0.45s system 99% cpu 5.290 total
% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.78s user 0.44s system 99% cpu 5.254 total
% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.69s user 0.44s system 99% cpu 5.139 total
2回目
% time /usr/bin/ruby =sha512.rb ~/testfile >/dev/null
/usr/bin/ruby =sha512.rb ~/testfile > /dev/null 4.82s user 0.44s system 99% cpu 5.269 total
% time /opt/local/bin/ruby =sha512.rb ~/testfile >/dev/null
/opt/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.78s user 0.44s system 99% cpu 5.238 total
% time ~/local/bin/ruby =sha512.rb ~/testfile >/dev/null
~/local/bin/ruby =sha512.rb ~/testfile > /dev/null 4.69s user 0.45s system 98% cpu 5.194 total
よい。
ちなみに OS付属のは -Os, MacPorts は -O2 だった
% /usr/bin/ruby -r rbconfig -e "p Config::CONFIG['configure_args']"
" '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-dependency-tracking' '--enable-pthread' '--enable-shared' '--prefix=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr' '--with-sitedir=/Library/Ruby/Site' 'ac_cv_func_getcontext=no' 'ac_cv_func_setcontext=no' 'CFLAGS=-arch i386 -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE' 'LDFLAGS=-arch i386 -arch x86_64 '"
% /opt/local/bin/ruby -r rbconfig -e "p Config::CONFIG['configure_args']"
" '--prefix=/opt/local' '--enable-shared' '--mandir=/opt/local/share/man' '--enable-pthread' '--without-tk' '--with-vendordir=/opt/local/lib/ruby/vendor_ruby' 'CC=/usr/bin/gcc-4.2' 'CFLAGS=-O2 -arch x86_64' 'LDFLAGS=-L/opt/local/lib' 'CPPFLAGS=-I/opt/local/include'"
0 件のコメント:
コメントを投稿