キーワードマッチ in_arrayと1byteインデックス比較 | php

簡単なキーワードフィルターを作ろうと思い。
in_arrayでも良いかなと思ったけど、1byteだけインデックスにしてみる。

キーワードを適当に、wikipediaから
$members = array(‘岩佐美咲’,’多田愛佳’,’大家志津香’,’片山陽加’,’倉持明日香’,’元チームK 21位’,’小嶋陽菜’ …

in_arrayはこれだけ

echo $search_word . “\n”;
$start = microtime(true);
for($i=0;$i<10000;$i++){
in_array($search_word,$members);
}
echo (microtime(true)-$start) . "\n";

1byte indexは、1byteだけ階層化する。

$member_index = array();
foreach( $members as $member ){
$fbin = bin2hex($member[0]);
if( !isset($member_index[$fbin])){
$member_index[$fbin] = array();
}
$member_index[$fbin][]=$member;
}
$start = microtime(true);
for($i=0;$i<10000;$i++){
$fbin = bin2hex($search_word[0]);
if(isset($member_index[$fbin])){
in_array( $search_word, $member_index[$fbin] );
}
}
echo (microtime(true)-$start). "\n"

これで、テスト

2564吉高由里子
1.4764289855957
0.49721598625183
0.026989936828613
2600キーワードで平均3倍の差でした。ヒット無しでも同じ。
2階層はだと50倍くらいですね(階層化しなくても2バイトで同じくらいです。このキーワード数だと。

ヒット無し
2564吉高由里
1.5446860790253
0.52448081970215
0.02910304069519

配列の最初に入っている物は
2653 岩佐美咲
0.003809928894043 – in_array
0.010469913482666 – 1
0.014750957489014 – 2
のように速いです。ソートしてないので。ソートしてもソートの先頭はこうなりますね

100個の中央キーワードでも
100 横山由依
0.02863597869873 – in_array
0.014019966125488 – 1
0.01491379737854 – 2
体の長さとかによって変わるくらいなので、数が少なければ(10個くらいなら)in_arrayだけで良さそうです。
それ以上は、分けた方が良いです。

最後に、今回のデータでは、階層化しない3byte(1文字)での比較が一番速かったです。
キーワードの数と分散によって変わるのでいろいろ試すと楽しいですね。

This entry was posted on 月曜日, 3月 19th, 2012 at 3:21 PM and is filed under php. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Unityによるゲームを公開しております iOS/Android
https://itunes.apple.com/jp/app/lost-knight-3d-action/id900917032
https://play.google.com/store/apps/details?id=com.groundroad.runknight

各種開発支援・機能開発等小さいお仕事などもお請けしております。
unity開発支援, PHPシステム開発, javascript/html5 フロント開発, titanium mobileアプリ開発
お気軽にお問い合わせください
大崎・五反田近郊での対面でのお打ち合わせはいつでも可能です。