More Related Content Similar to Phpmatsuri2011 LT j_nakada Similar to Phpmatsuri2011 LT j_nakada (20) More from Junpei Nakada (10) Phpmatsuri2011 LT j_nakada2. 自己紹介
3B
• 中田淳平
• Twitter:@j_nakada
• 株式会社Razest
– なんちゃって取締役CTO
– 携帯ゲームとか作ってます
• PHP,MySQL,Flash Lite,AWS
• JAWSUG大阪(11/5 RDSについて話すよ!)
PHP MATSURI 2011
3. 3B
• Titanium
• CakePHP
• Symfony
• Lithium
Speaker’s number:3B
Point:3
PHP MATSURI 2011
4. PHP拡張モジュール
3B
• PHP extension
– PECLでおなじみ
– Cで書かれてるので速いらしい
– 携帯向けFlash動的生成の自社ライブラリを高速
化できるかも!
– Klabさんのblogに作り方があった
http://dsas.blog.klab.org/archives/50777398.html
PHP MATSURI 2011
5. 作ってみた
3B
• 円周率を15000ケタ計算する
– アルゴリズムはコツコツ法(spigot)
– CとPHPで同じアルゴリズムで書く
PHP MATSURI 2011
6. test_ext.c
PHP_FUNCTION(ext_pi){ d = 0;
3B
int a = 10000; for( b = c - 1 ; b > 0 ; b-- ) {
int c = 52500; g = 2 * b - 1;
int b,d,e,g; d = d * b + f[b] * a;
int f[52514]; f[b] = d % g;
d /= g;
for( b = 0 ; b < c ; b++ ) { }
f[b] = a / 5; printf("%04d", e + d / a);
} e = d % a;
e = 0; }
for( c = 52500 ; c > 0 ; c -= 14 ) { return ;
}
PHP MATSURI 2011
7. 3B
pi.php php.ini
<?php extension=test_ext.so
ext_pi();
?>
PHP MATSURI 2011
8. デモ
3B
• 時間かかるので省略
• ソースは、GitHubにあげました
https://github.com/j-nakada/phpmatsuri2011
PHP MATSURI 2011
9. 結果
3B
• PHP:42秒
• PHP extension:1.8秒
20倍以上高速化
ゲームの戦闘処理やバッチ処理に向いてるね!
PHP MATSURI 2011
10. おまけ
3B
• PHP→Cへの引数の渡し方を調べた
– ext/standard/string.c
– substrでの引数の取得
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"sl|l", &str, &str_len, &f, &l)
型変換をするような処理が入ってる
PHP MATSURI 2011
11. おまけ
3B
• zend_get_parameters_array_ex
– 引数を受け取れる
– zend_get_parameters_exは非推奨
– 型変換はしてくれないので、自分で処理を書く
if (Z_TYPE_PP(params[0]) != IS_STRING){
SEPARATE_ZVAL(params[0]);
convert_to_string_ex(params[0]);
}
PHP MATSURI 2011
12. おまけ?
3B
• ext/standard/string.c
– PHP_FUNCTION(substr)
• zend_parse_parameters
→zend_get_parameters_array_ex
• 型チェックと型変換処理の追加
substrの実行速度が10%上がったよ
PHP MATSURI 2011
13. パッチ作りました
3B
https://github.com/j-nakada/phpmatsuri2011/blob/master/string.patch
+++ string.c 2011-10-15 13:36:04.062694910 +0000
@@ -2147,17 +2147,43 @@
Returns part of a string */
PHP_FUNCTION(substr)
{
+ zval ***params;
char *str;
long l = 0, f;
int str_len;
int argc = ZEND_NUM_ARGS();
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|l", &str, &str_len, &f, &l) ==
FAILURE) {
- return;
+ params = safe_emalloc(sizeof(zval **), argc, 0);
+ if (zend_get_parameters_array_ex(argc, params) == FAILURE) {
PHP MATSURI 2011
14. でも
3B
• 元のソースのほうがエレガント
おまけは置いといて結論は
PHP Extensionは高速!
PHP MATSURI 2011