Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Phpmatsuri2011 LT j_nakada

946 views

Published on

  • Be the first to comment

  • Be the first to like this

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

×