スライスでのデータアクセスのパフォーマンス
スライスでのアクセスのほうがパフォーマンスが出ると思っているが、
実際どの程度の差なのか少し気になったので測ってみた。
datafile.yaml
データ構造を考えるのがめんどくさかったので、ここから拾ってきました。
るびま
teams: - name: Akudaman members: - name: Mujo age: 24 leader: yes - name: Tobokkee age: 25 - name: Donjuro age: 30 - name: Doronboo members: - name: Doronjo age: 24 leader: yes - name: Boyakkie age: 25 - name: Tonzuraa age: 30
array_slice.pl
use Benchmark qw( cmpthese ); use Config::YAML; my $config = Config::YAML->new( config => 'datafile.yaml' ); my @values = (); sub idx { @values = ( $config->{teams}[0]{members}[0], $config->{teams}[0]{members}[2], ); } sub idx_with_temp { my $temp = $config->{teams}[0]{members}; @values = ( $temp->[0], $temp->[2], ); } sub slice { @values = @{ $config->{teams}[0]{members} }[ 0, 2 ]; } cmpthese( 1_000_000, { idx => sub { idx() }, idx_with_temp => sub { idx_with_temp() }, slice => sub { slice() }, });
結果
$ perl array_slice.pl Rate idx idx_with_temp slice idx 378788/s -- -22% -43% idx_with_temp 487805/s 29% -- -26% slice 662252/s 75% 36% -- $ perl array_slice.pl Rate idx idx_with_temp slice idx 384615/s -- -21% -45% idx_with_temp 485437/s 26% -- -30% slice 694444/s 81% 43% --
hash_slice.pl
use Benchmark qw( cmpthese ); use Config::YAML; my $config = Config::YAML->new( config => 'datafile.yaml' ); my @values = (); sub key { @values = ( $config->{teams}[0]{members}[0]->{name}, $config->{teams}[0]{members}[0]->{age}, ); } sub key_with_temp { my $temp = $config->{teams}[0]{members}[0]; @values = ( $temp->{name}, $temp->{age}, ); } sub slice { @values = @{ $config->{teams}[0]{members}[0] }{ 'name', 'age' }; } cmpthese( 1_000_000, { key => sub { key() }, key_with_temp => sub { key_with_temp() }, slice => sub { slice() }, });
結果
$ perl hash_slice.pl Rate key_with_temp key slice key_with_temp 233100/s -- -24% -32% key 306748/s 32% -- -11% slice 343643/s 47% 12% -- $ perl hash_slice.pl Rate key key_with_temp slice key 363636/s -- -6% -29% key_with_temp 387597/s 7% -- -25% slice 515464/s 42% 33% --
まとめ
概ね予想通りだった。
複雑なデータ構造の(配列|ハッシュ)から、データを取り出す場合はスライスを使ったほうがパフォーマンスはいい。
(といっても微々たるものなんだろうけど。)
さくらVPSで、メールを送信出来るようにする
以下のページを見ながら、postfixのインストールと設定。
さくらのVPSをもう少しセットアップしてみる | @blog.justoneplanet.info
とりあえず、送信専用。
"/etc/postfix/main.cf" 更新箇所
myhostname = www9999u.sakura.ne.jp mydomain = www9999u.sakura.ne.jp myorigin = $mydomain # SMTP-Auth configuration smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination # limit message_size_limit = 10485760
saslauthdの起動
/etc/rc.d/init.d/saslauthd start /sbin/chkconfig saslauthd on /sbin/chkconfig --list caslauthd
[日記][Perl] PerlでタイムラインからURL付きのツイートのみを拾ってBloggerに投稿するスクリプトを作った
思ったよりも時間がかかったけれど、なんとなく動いたので結果報告。
ソースコードは、そのうちgithubに上げます。。
今後どうするの
まとめ
まず、このスクリプトを作った理由ですが、以下の3つ。
- フォローワー増えてきて、タイムライン追えなくなってきた
- とある事情で、日中ツイッターを見れなくなった
- 自宅で何か作ってみたかった
で、実際に作ってみて思ったのが、「想像以上に自分使えねぇ」ってことでした。
分かったつもりでいたことが、実はそれほど分かってなかったことが多く、
それらを知るいい経験になったとおもってます。
本ばっかり読むんじゃなくて、ちゃんと実践しないとダメだね。
サンプルコード書いて満足しちゃってた。反省。
使ったモジュール
FindBin
Encode
Config::Pit
DateTime
Data::Section::Simple
Template
Email::MIME::CreateHTML
Email::Send
Net::Twitter
Web::Scraper
Date::Calc
LWP::UserAgent
HTTP::Request
フィボナッチ整列を求めるようなサンプルコード
とある事情で書いたけど、本当に必要だったのは違うものだった。
まぁせっかくなので、ブログに書く。
use strict; use warnings; use Math::BigInt; { my @fibonacci_number = (); sub fibonacci { my $num = shift; unless ( $fibonacci_number[$num] ) { if ( $num <= 1 ) { $fibonacci_number[$num] = Math::BigInt->new( $num ); } else { $fibonacci_number[$num] = fibonacci( $num-1 ) + fibonacci( $num-2 ); } } return $fibonacci_number[$num]; } } print fibonacci( 1 ), "\n"; print fibonacci( 10 ), "\n"; print fibonacci( 100 ), "\n";
桁が大きすぎると、指数表記されてしまうのでMath::BigInt使いました。
my.cnfが見当たらない
そろそろ、自宅でもMySQL使いそうなのでちゃんと設定しておこうと思った。
だけど、my.cnfが見当たらない。
ドキュメント読んで解決。
MySQLは指示された通りの順序でオプションファイルを探し、その中で存在するものを解読します。もし使用したいオプションファイルが存在しなければ、プレーンテキストエディタで新しく作ってください。
http://dev.mysql.com/doc/refman/5.1/ja/option-files.html
というけで、/etc/my.cnf を作成。
long_query_time に 1秒を指定して、MySQL再起動。
show variables like 'long_query_time'; で設定が反映されていることを確認。