下記サイトより。
http://www.100shiki.com/archives/2013/05/api_for_that.html
各種APIの情報をまとめたサイトは下記。
http://www.apiforthat.com/
2013年5月3日金曜日
よくわかる最適化
shi3z氏のプログラム最適化の具体的な手順を綴った記事が面白い。
http://d.hatena.ne.jp/shi3z/20130502
現状自分はプログラムをテスタブルにすることくらいしか意識していないが、この人は
Cかな?プログラムの速度を以下に速くしていくかに関してのチューニング方法に関して
具体的な記載をしている。
頭の整理も兼ねて最適化の観点に関してまとめてみると、
・除算は乗算に変える
☓float v0 = (p2 - p0) / 2.0f ;
○float v0 = (p2 - p0) * 0.5f ;
・同じ掛け算は極力一つにまとめる
☓return v0 * t * t + v1 * t * t * t;
○float t2 = t * t;return (v0 + v1 * t) * t2;
・加算にできるのであれば乗算を加算にする
☓for(int i = 0; i < num; i++) {
x = func(i * num);
}
○float arg = 0;
for(int i = 0; i < num; i++, arg += num) {
x = func(arg);
}
・分岐は極力排除する。分岐は平方根計算よりも遅い
・関数呼び出しは極力排除。メイン関数の中に展開する
→これは現場によって考えが分かれそう。異動の多い複数人でコードのメンテを職場で、
これやると読みにくいし、テストも書きにくくなるし結構きつい・・
というところかな。
http://d.hatena.ne.jp/shi3z/20130502
現状自分はプログラムをテスタブルにすることくらいしか意識していないが、この人は
Cかな?プログラムの速度を以下に速くしていくかに関してのチューニング方法に関して
具体的な記載をしている。
頭の整理も兼ねて最適化の観点に関してまとめてみると、
・除算は乗算に変える
☓float v0 = (p2 - p0) / 2.0f ;
○float v0 = (p2 - p0) * 0.5f ;
・同じ掛け算は極力一つにまとめる
☓return v0 * t * t + v1 * t * t * t;
○float t2 = t * t;return (v0 + v1 * t) * t2;
・加算にできるのであれば乗算を加算にする
☓for(int i = 0; i < num; i++) {
x = func(i * num);
}
○float arg = 0;
for(int i = 0; i < num; i++, arg += num) {
x = func(arg);
}
・分岐は極力排除する。分岐は平方根計算よりも遅い
・関数呼び出しは極力排除。メイン関数の中に展開する
→これは現場によって考えが分かれそう。異動の多い複数人でコードのメンテを職場で、
これやると読みにくいし、テストも書きにくくなるし結構きつい・・
というところかな。
2013年4月19日金曜日
Object::Containerって何だ?
このへん見とくのが分かりやすそう。
http://perl-users.jp/articles/advent-calendar/2011/casual/10
http://search.cpan.org/~typester/Object-Container-0.08/lib/Object/Container/ja.pod
珍しくCPANの説明も比較的わかりやすい。
どうやらいくつものモジュールをいちいちnewするのめんどいしコストかかるじゃん、
そうだ最初に一度にnewしといてキャッシュしとけば便利じゃね?というもののようだ。
newしたもの、つまりインスタンスを大量に格納しておくモジュールだから「コンテナ」ということか。
package MyContainer;
use Object::Container '-base';
my @object = qw/
foo
bar
/;
for (@object) {
register($_);
}
みたいに予めインスタンスをキャッシュするモジュールを作っておいて
他のモジュールで
package Hoge;
use MyContainer;
my $object_foo = MyContainer->get('foo');
my $object_bar = MyContainer->get('bar');
みたいにしてあれこれやればよいということだと思う。
http://perl-users.jp/articles/advent-calendar/2011/casual/10
http://search.cpan.org/~typester/Object-Container-0.08/lib/Object/Container/ja.pod
珍しくCPANの説明も比較的わかりやすい。
どうやらいくつものモジュールをいちいちnewするのめんどいしコストかかるじゃん、
そうだ最初に一度にnewしといてキャッシュしとけば便利じゃね?というもののようだ。
newしたもの、つまりインスタンスを大量に格納しておくモジュールだから「コンテナ」ということか。
package MyContainer;
use Object::Container '-base';
my @object = qw/
foo
bar
/;
for (@object) {
register($_);
}
みたいに予めインスタンスをキャッシュするモジュールを作っておいて
他のモジュールで
package Hoge;
use MyContainer;
my $object_foo = MyContainer->get('foo');
my $object_bar = MyContainer->get('bar');
みたいにしてあれこれやればよいということだと思う。
2013年4月18日木曜日
Cometのまとめ
http://codezine.jp/article/detail/733
探した限り、一番わかり易い説明が上記。
Cometとは一言で言うとサーバー側からリアルタイムにレスポンスを受け取るための技術
で、普通はそんなことできないじゃん、だってこっちがリクエストを投げない限りサーバーは
レスポンスを返さないでしょ?という疑問に対し丁寧に説明をしている。
チャットツールを例に取り、リアルタイムでレスポンスを受け取る方法をいくつか解説している。
1:F5連打法。F5連打すればサーバーに新たなメッセージが届いた時すぐサーバーのデータを
取得できるね、でもF5連打するの大変じゃね?
2.ブラウザが定期的にリロードする方法。自動化されてるけど、間隔が短すぎるとリロードの
たびに何もできない時間が生じてうざいよね?
3.Ajaxを使った方法。ページ全読み込みじゃないから2の方法よりはましだね。でも更新間隔
を長くすると新着メッセージの反映が遅れるね。
4.Cometを使った方法。じゃあこっちがリクエストを投げた時に新着メッセージが届くまで
なんもレスポンスを返さずに待ち状態にしといて、メッセージが届いた瞬間にレスを返せば
よくね?というこっちが投げたボールをサーバーがずっと持っとくという画期的アイデアに
よって、リアルタイムレスポンスを実現したとさ。めでたしめでたし。
という感じ。
探した限り、一番わかり易い説明が上記。
Cometとは一言で言うとサーバー側からリアルタイムにレスポンスを受け取るための技術
で、普通はそんなことできないじゃん、だってこっちがリクエストを投げない限りサーバーは
レスポンスを返さないでしょ?という疑問に対し丁寧に説明をしている。
チャットツールを例に取り、リアルタイムでレスポンスを受け取る方法をいくつか解説している。
1:F5連打法。F5連打すればサーバーに新たなメッセージが届いた時すぐサーバーのデータを
取得できるね、でもF5連打するの大変じゃね?
2.ブラウザが定期的にリロードする方法。自動化されてるけど、間隔が短すぎるとリロードの
たびに何もできない時間が生じてうざいよね?
3.Ajaxを使った方法。ページ全読み込みじゃないから2の方法よりはましだね。でも更新間隔
を長くすると新着メッセージの反映が遅れるね。
4.Cometを使った方法。じゃあこっちがリクエストを投げた時に新着メッセージが届くまで
なんもレスポンスを返さずに待ち状態にしといて、メッセージが届いた瞬間にレスを返せば
よくね?というこっちが投げたボールをサーバーがずっと持っとくという画期的アイデアに
よって、リアルタイムレスポンスを実現したとさ。めでたしめでたし。
という感じ。
redisのまとめ
http://gihyo.jp/dev/feature/01/redis
メモリ内にデータを格納するキーバリューストアでNoSQLの一種。
メモリ内にデータを蓄えるので高速に動く。
memcachedとの違いは、memcachedはGETやSETなどシンプルな操作に特化している
のに対して、redisはいろいろと複雑な操作ができること。
memcachedは古いデータから順に削除するが、redisは明示的に削除をするか、timeoutを
設定しない限り削除されない
永続化の機能を持っている。すなわち、オンメモリのデータストアの欠点である、クラッシュ
したらデータが消えてしまうという欠点をカバーしていて、定期的にデータダンプをする機能
がある。
キーバリューストアのバリューの部分にデータ構造を格納することができる。
リスト、セット、ソート済みのセット、ハッシュなど。
memcachedは特定の番組をみた数万人のユーザーIDのリストなどの巨大なデータ構造の
データを扱うことが難しい。また、データの永続化ができないので、消えた時のために
永続化する仕組み(MySQLなど)を用意する必要があった。
文字列データの取得とセット、削除
取得:GET キー名
セット:SET キー名 値
削除:DEL キー名
数値型のデータのインクリメント、デクリメント
インクリメント:INCR キー名
デクリメント:DECR キー名
データのタイムアウト値の設定
タイムアウト設定:EXPIRE キー名 タイムアウト秒数
複数コマンドのアトミック実行(SQLのトランザクションみたいなもの、コマンドは全部成功
したか、全部失敗したかの2種類しか存在しないようにする)
MULTI
GETやSETなど、redisコマンドを複数記載
EXEC
でMULTIとEXECの間のコマンドをアトミックに実行
※どうやらロールバックはないので、途中で失敗して、どちらかのコマンドだけが実行されて
しまうということも発生するようだ。
まとめると、redisは
MySQLと比較するとデータアクセスは速いが容量は少ない
memcachedと比較すると値にハッシュなどデータ構造を格納することができ、メモリが
クラッシュしても大丈夫なように永続化の機能も持っている
という感じ。
メモリ内にデータを格納するキーバリューストアでNoSQLの一種。
メモリ内にデータを蓄えるので高速に動く。
memcachedとの違いは、memcachedはGETやSETなどシンプルな操作に特化している
のに対して、redisはいろいろと複雑な操作ができること。
memcachedは古いデータから順に削除するが、redisは明示的に削除をするか、timeoutを
設定しない限り削除されない
永続化の機能を持っている。すなわち、オンメモリのデータストアの欠点である、クラッシュ
したらデータが消えてしまうという欠点をカバーしていて、定期的にデータダンプをする機能
がある。
キーバリューストアのバリューの部分にデータ構造を格納することができる。
リスト、セット、ソート済みのセット、ハッシュなど。
memcachedは特定の番組をみた数万人のユーザーIDのリストなどの巨大なデータ構造の
データを扱うことが難しい。また、データの永続化ができないので、消えた時のために
永続化する仕組み(MySQLなど)を用意する必要があった。
文字列データの取得とセット、削除
取得:GET キー名
セット:SET キー名 値
削除:DEL キー名
数値型のデータのインクリメント、デクリメント
インクリメント:INCR キー名
デクリメント:DECR キー名
データのタイムアウト値の設定
タイムアウト設定:EXPIRE キー名 タイムアウト秒数
複数コマンドのアトミック実行(SQLのトランザクションみたいなもの、コマンドは全部成功
したか、全部失敗したかの2種類しか存在しないようにする)
MULTI
GETやSETなど、redisコマンドを複数記載
EXEC
でMULTIとEXECの間のコマンドをアトミックに実行
※どうやらロールバックはないので、途中で失敗して、どちらかのコマンドだけが実行されて
しまうということも発生するようだ。
まとめると、redisは
MySQLと比較するとデータアクセスは速いが容量は少ない
memcachedと比較すると値にハッシュなどデータ構造を格納することができ、メモリが
クラッシュしても大丈夫なように永続化の機能も持っている
という感じ。
2013年4月16日火曜日
memcachedのまとめ
キーバリューストア(KVS)という、ハッシュのようにキーと値のセットでメモリ上にデータを
格納できるソフトウェア。長所はメモリ上にデータを保存しているので
値の格納は下記のようにして行う。
my $add = $memcached->add( 'キー', '値', '期限' );
my $replace = $memcached->replace( 'キー', '値', '期限' );
my $set = $memcached->set( 'キー', '値', '期限' );
値の取り出しは下記のようにして行う。
my $val = $memcached->get('キー');
my $val = $memcached->get_multi('キー1', 'キー2', 'キー3', 'キー4', 'キー5');
格納できるソフトウェア。長所はメモリ上にデータを保存しているので
値の格納は下記のようにして行う。
my $add = $memcached->add( 'キー', '値', '期限' );
my $replace = $memcached->replace( 'キー', '値', '期限' );
my $set = $memcached->set( 'キー', '値', '期限' );
値の取り出しは下記のようにして行う。
my $val = $memcached->get('キー');
my $val = $memcached->get_multi('キー1', 'キー2', 'キー3', 'キー4', 'キー5');
詳しくは下記を参照。
Q4Mのまとめ
Q4MとはMySQLを使ったキューのこと。ある処理を非同期で順番に処理したいときに使う。
使い方はQ4Mをインストールして好きなテーブルを設定したら、
insert文でキューを挿入し、select queue_wait(テーブル名)でキューを取り出し、
該当キューの処理が終わったらselect queue_end(テーブル名)で該当キューを終了させる。
詳細な使い方は下記のページを参照。
http://gihyo.jp/dev/serial/01/perl-hackers-hub/001003?page=1
インストール方法はこれ。
http://blog.nomadscafe.jp/2011/12/q4m---mysql-casual-advent-calendar-2011.html
使い方はQ4Mをインストールして好きなテーブルを設定したら、
insert文でキューを挿入し、select queue_wait(テーブル名)でキューを取り出し、
該当キューの処理が終わったらselect queue_end(テーブル名)で該当キューを終了させる。
詳細な使い方は下記のページを参照。
http://gihyo.jp/dev/serial/01/perl-hackers-hub/001003?page=1
インストール方法はこれ。
http://blog.nomadscafe.jp/2011/12/q4m---mysql-casual-advent-calendar-2011.html
登録:
投稿 (Atom)