Phpmatsuri2011 LT j_nakada
Upcoming SlideShare
Loading in...5
×
 

Phpmatsuri2011 LT j_nakada

on

  • 784 views

 

Statistics

Views

Total Views
784
Slideshare-icon Views on SlideShare
781
Embed Views
3

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 3

http://paper.li 2
http://slideclip.b-prep.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Phpmatsuri2011 LT j_nakada Phpmatsuri2011 LT j_nakada Presentation Transcript

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