Phpmatsuri2011 LT j_nakada

876 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
876
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Phpmatsuri2011 LT j_nakada

  1. 1. 3BPHP拡張モジュール使ってみた @j_nakada PHP MATSURI 2011
  2. 2. 自己紹介 3B• 中田淳平• Twitter:@j_nakada• 株式会社Razest – なんちゃって取締役CTO – 携帯ゲームとか作ってます• PHP,MySQL,Flash Lite,AWS• JAWSUG大阪(11/5 RDSについて話すよ!) PHP MATSURI 2011
  3. 3. 3B• Titanium• CakePHP• Symfony• Lithium Speaker’s number:3B Point:3 PHP MATSURI 2011
  4. 4. PHP拡張モジュール 3B• PHP extension – PECLでおなじみ – Cで書かれてるので速いらしい – 携帯向けFlash動的生成の自社ライブラリを高速 化できるかも! – Klabさんのblogに作り方があった http://dsas.blog.klab.org/archives/50777398.html PHP MATSURI 2011
  5. 5. 作ってみた 3B• 円周率を15000ケタ計算する – アルゴリズムはコツコツ法(spigot) – CとPHPで同じアルゴリズムで書く PHP MATSURI 2011
  6. 6. test_ext.cPHP_FUNCTION(ext_pi){ d = 0; 3Bint 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. 7. 3Bpi.php php.ini<?php extension=test_ext.soext_pi();?> PHP MATSURI 2011
  8. 8. デモ 3B• 時間かかるので省略• ソースは、GitHubにあげました https://github.com/j-nakada/phpmatsuri2011 PHP MATSURI 2011
  9. 9. 結果 3B• PHP:42秒• PHP extension:1.8秒 20倍以上高速化 ゲームの戦闘処理やバッチ処理に向いてるね! PHP MATSURI 2011
  10. 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. 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. 12. おまけ? 3B• ext/standard/string.c – PHP_FUNCTION(substr) • zend_parse_parameters →zend_get_parameters_array_ex • 型チェックと型変換処理の追加substrの実行速度が10%上がったよ PHP MATSURI 2011
  13. 13. パッチ作りました 3Bhttps://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. 14. でも 3B• 元のソースのほうがエレガントおまけは置いといて結論は PHP Extensionは高速! PHP MATSURI 2011
  15. 15. 3B•Speaker’s number:3B•Point:3 PHP MATSURI 2011

×