最終更新:
callistoiv 2009年10月01日(木) 01:42:16
今さらBenchmarkを使ってみる « 岩家ぶろぐ
Pumpkin Moonshine: PerlでSQLiteとCSVのどちらを使ったほうが検索が速いかを検証
iandeth. - Benchmark モジュールの使い方、結果情報の読み方
YappoLogs: Perlで数有る$selfを取る手法をベンチマーク取った
スクリプト
実行結果
今回はあまり意味の無いサブルーチンを2つ書いてみて、ベンチマークをとってみた。
大事なのは、timethese、cmptheseを使うことなので気にしないで。
cmptheseはtimetheseの戻り値を受けて自動的に表と比較をして出力します。
Pumpkin Moonshine: PerlでSQLiteとCSVのどちらを使ったほうが検索が速いかを検証
iandeth. - Benchmark モジュールの使い方、結果情報の読み方
YappoLogs: Perlで数有る$selfを取る手法をベンチマーク取った
スクリプト
#!/usr/local/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);
my $count =1000000;
my $results = timethese($count,
{'TEST CASE1' => 'sub1;', 'TEST CASE2'=>'sub2;'}
);
cmpthese($results);
sub sub1{
my $str = "Hello\n";
}
sub sub2{
my $str = "Hello World!\n";
$str = sprintf("%s", $str);
}
実行結果
Benchmark: timing 1000000 iterations of TEST CASE1, TEST CASE2...
TEST CASE1: 1 wallclock secs ( 0.65 usr + 0.00 sys = 0.65 CPU) @ 1536098.31/s (n=1000000)
TEST CASE2: 2 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 892060.66/s(n=1000000)
Rate TEST CASE2 TEST CASE1
TEST CASE2 892061/s -- -42%
TEST CASE1 1536098/s 72% --
今回はあまり意味の無いサブルーチンを2つ書いてみて、ベンチマークをとってみた。
大事なのは、timethese、cmptheseを使うことなので気にしないで。
cmptheseはtimetheseの戻り値を受けて自動的に表と比較をして出力します。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Benchmark qw(:all);
my $bench_start = new Benchmark;
###
forcal();
###
my $bench_end = new Benchmark;
my $disp_bench = timestr(timediff($bench_end,$bench_start));
print "$disp_bench\n";
$disp_bench =~ s/.*\((.*?)\).*/$1/;
print "$disp_bench";
sub forcal{
my $sum =0;
for(my $i=0;$i<1000000;$i++){
$sum += $i;
}
return $sum;
}
実行結果
0 wallclock secs ( 0.39 usr + 0.00 sys = 0.39 CPU) 0.39 usr + 0.00 sys = 0.39 CPUコードのスタートと終わりにBenchmarkクラスを生成して、
それの時間差を測定することでもベンチマークは取れます。
#! /usr/bin/perl -w
use strict;
use warnings;
use DBI;
my $file = "SQL.csv";
my $table = "earthq";
my $dbh = DBI->connect("DBI:CSV:f_dir=.");
my $query = "SELECT * FROM $file WHERE mag > 5 AND date BETWEEN '2001/01/01 00:00:00' AND '2002/12/31 23:59:59'";
my $sth = $dbh->prepare($query);
$sth->execute() or die "Cannot excute".$sth->errstr();
#実行結果の読み取り
while(my $row = $sth->fetchrow_hashref){
print "Found $row->{'date'},$row->{'mag'}\n";
}
対象のCSVファイルはこんな感じ。
date、秒、経度、緯度、深度、マグニチュード。
date,sec,lon,lat,dep,mag 2003/1/1 17:20,47,130.38,31.16,146.78,3.9 2003/1/2 14:46,45,123.49,24.06,20.8,4 2003/1/3 22:27,23,121.91,24.8,37,4.3 2003/1/4 10:48,46,129.42,28.07,41.26,3.6 2003/1/5 2:33,19,131.08,31.89,9.27,3.7 2003/1/6 14:57,34,121.71,20.3,0,5.4 2003/1/7 18:06,19,130.17,27.92,52.06,3.7 2003/1/8 20:19,46,125.17,25.85,19.73,4.9 2003/1/9 11:47,30,133.72,33.7,37.53,3.5 2003/1/10 12:01,48,130.36,28.13,23.35,3.6
ファイル名がテーブル名になることに注意して、
DBにconnectさえできれば後は普通にRDBを扱うのと一緒だと思う。
思い通り動いたんだけど、型指定してないけどなんで動くの?
TIMESTAMP型指定しなくてもいいの?(・ω・)?
まぁ、その辺の難しいことは置いてちょっと比較。
| レコード数 | ベンチマーク |
|---|---|
| 100 | 0 wallclock secs ( 0.10 usr + 0.03 sys = 0.13 CPU) @ 7.69/s (n=1) |
| 1000 | 0 wallclock secs ( 0.10 usr + 0.03 sys = 0.13 CPU) @ 7.69/s (n=1) |
| 10000 | 2 wallclock secs ( 1.31 usr + 0.00 sys = 1.31 CPU) @ 0.76/s (n=1) |
| 50000 | 8 wallclock secs ( 7.47 usr + 0.01 sys = 7.48 CPU) @ 0.13/s (n=1) |
| 100000 | 13 wallclock secs (12.86 usr + 0.03 sys = 12.89 CPU) @ 0.08/s (n=1) |
10000件より先は時間とレコード数が比例関係がある。
10000件程度までなら意外と早い。
XML::Atom::Entry
XML::Atom::Client
今回のコードはこの辺のモジュールを使いました。
XML::LibXML
XML::Atomのインストール時にLibXMLが無いって言われたんですけど、
これのインストールに関しては結局何とかなったんだけどどうしてうまくいったかうまく書けない。
ライブドアブログに投稿するコードです。
インストール手順
ref:http://tech.bayashi.jp/archives/entry/perl/2007/00...
Rubyのコードですけど同じライブドアなので掲載
ref:Ruby で livedoor blog の Atom API にアクセス - WebOS Goodies
XML::Atom::Client
今回のコードはこの辺のモジュールを使いました。
XML::LibXML
XML::Atomのインストール時にLibXMLが無いって言われたんですけど、
これのインストールに関しては結局何とかなったんだけどどうしてうまくいったかうまく書けない。
ライブドアブログに投稿するコードです。
#!/usr/bin/perl -w
use strict;
use XML::Atom;
use XML::Atom::Client;
use XML::Atom::Entry;
#http://cms.blog.livedoor.com/atom
# my $PostURI = 'http://cms.blog.livedoor.com/atom/blog_id=xxxxxxx';
my $PostURI = 'http://cms.blog.livedoor.com/atom/blog_id=';
my $api = XML::Atom::Client->new;
$api->username('loginname'); #ここに自分のログインネーム
$api->password('password'); #ここに自分のlivedoorblogのパスワード
my $entry = XML::Atom::Entry->new;
$entry->title('test entry'); #タイトル
$entry->content('delete this soon.'); #本文
my $EditURI = $api->createEntry($PostURI,$entry);
print $EditURI."\n"; #出力結果: http://cms.blog.livedoor.com/atom/blog_id=xxxxxxx/entry_id=1234567
インストール手順
ref:http://tech.bayashi.jp/archives/entry/perl/2007/00...
Rubyのコードですけど同じライブドアなので掲載
ref:Ruby で livedoor blog の Atom API にアクセス - WebOS Goodies
use Encode;
$string='表示';
print encode('UTF-8',$string);
UrlEncode.net URLエンコードhttp://urlencode.net/
DBIモジュール|http://search.cpan.org/~timb/DBI-1.609/DBI.pm?
下準備
MySQLに接続するコード
第2章 DBI クイックリファレンス [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/02.html
第5章 データベースハンドル [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/05.html
PerlでMySQL操作CGIを作ろう(2/4)
http://www.atmarkit.co.jp/flinux/rensai/mysql04/my...
mysql> GRANT ALL ON *.* TO 'user_perl'@'localhost' IDENTIFIED BY 'password'; mysql> CREATE DATABASE prime DEFAULT CHARSET utf8;
MySQLに接続するコード
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
# データソース
my $dsn = 'DBI:mysql:prime';
# ユーザ名
my $user = 'user';
# パスワード
my $password = 'password';
# データベースへ接続
my $dbh = DBI->connect($dsn, $user, $password,
{ RaiseError => 1, AutoCommit => 0 });
# CREATE TABLE num (prime INTEGER PRIMARY KEY);
my @array = (2,3,5,7,11,13,17,19);
for my $i (@array){
my $statement ="INSERT INTO num VALUES ($i)";
$dbh->do($statement) || die $dbh->errstr;
}
$dbh->disconnect;
第2章 DBI クイックリファレンス [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/02.html
第5章 データベースハンドル [Perl講座 -Smart]
http://www.rfs.jp/sb/perl/dbi/05.html
PerlでMySQL操作CGIを作ろう(2/4)
http://www.atmarkit.co.jp/flinux/rensai/mysql04/my...
#!/usr/bin/perl
use strict;
use warnings;
use Cache::Memcached;
my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
servers => ["127.0.0.1:11211"],
compress_threshold => 10_000
});
$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n";
このサンプルコードだとあんまりメリットを感じないかもしれないけど、ちゃんとBenchmarkをとれば効果は分かるかもしれない。
memcachedを知り尽くす:第1回 memcachedの基本|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/memcached/0001?page...
[perl] Memcachedのインストール・利用方法 - ありんく tech-log
http://www.alink.co.jp/tech/blog/2009/04/16/perl-m...
Cache::Memcached::Fastを試す : blog.nomadscafe.jp
http://blog.nomadscafe.jp/archives/000734.html
http://www.alink.co.jp/tech/blog/2009/04/16/perl-m...
Cache::Memcached::Fastを試す : blog.nomadscafe.jp
http://blog.nomadscafe.jp/archives/000734.html
最新コメント