SlideShare a Scribd company logo
1 of 15
Download to read offline
3B


PHP拡張モジュール使ってみた

     @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.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
3B
pi.php               php.ini
<?php                extension=test_ext.so
ext_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
パッチ作りました
                                                                                        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
でも
                          3B
• 元のソースのほうがエレガント


おまけは置いといて結論は
 PHP Extensionは高速!


       PHP MATSURI 2011
3B
•Speaker’s number:3B
•Point:3



        PHP MATSURI 2011

More Related Content

What's hot

2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talkmitamex4u
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法dc1394
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数Wataru Terada
 

What's hot (20)

2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Hupc 1
Hupc 1Hupc 1
Hupc 1
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
C++11
C++11C++11
C++11
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
C++による数値解析の並列化手法
C++による数値解析の並列化手法C++による数値解析の並列化手法
C++による数値解析の並列化手法
 
Ilerpg Study 003
Ilerpg Study 003Ilerpg Study 003
Ilerpg Study 003
 
Map
MapMap
Map
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
Ilerpg Study 004
Ilerpg Study 004Ilerpg Study 004
Ilerpg Study 004
 

Viewers also liked

サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26
サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26
サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26Naoto Koshikawa
 
Sistemas operativos para móviles
Sistemas operativos para móvilesSistemas operativos para móviles
Sistemas operativos para móvilesDidier Alexander
 
次の京都旅のススメ
次の京都旅のススメ次の京都旅のススメ
次の京都旅のススメKana Izumi
 
Assignment 2 Presentation
Assignment 2 PresentationAssignment 2 Presentation
Assignment 2 Presentation203pitches
 

Viewers also liked (9)

super HIMO theory
super HIMO theorysuper HIMO theory
super HIMO theory
 
サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26
サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26
サービス開発者の読書会 #2「アジャイルサムライ」2012.4.26
 
Sistemas operativos para móviles
Sistemas operativos para móvilesSistemas operativos para móviles
Sistemas operativos para móviles
 
次の京都旅のススメ
次の京都旅のススメ次の京都旅のススメ
次の京都旅のススメ
 
Aizu.LT05
Aizu.LT05Aizu.LT05
Aizu.LT05
 
La tecnologia
La tecnologiaLa tecnologia
La tecnologia
 
Port Ami
Port AmiPort Ami
Port Ami
 
Vim For Php
Vim For PhpVim For Php
Vim For Php
 
Assignment 2 Presentation
Assignment 2 PresentationAssignment 2 Presentation
Assignment 2 Presentation
 

Similar to Phpmatsuri2011 LT j_nakada

第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUpKenichi Mukai
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Kenta Oono
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみたy-uti
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!shinjiigarashi
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境Yo Ya
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料Junichi Ishida
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019Rui Hirokawa
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!Shinpei Ohtani
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3ichikaway
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 

Similar to Phpmatsuri2011 LT j_nakada (20)

第21回Creators MeetUp
第21回Creators MeetUp第21回Creators MeetUp
第21回Creators MeetUp
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)Introduction to Chainer (LL Ring Recursive)
Introduction to Chainer (LL Ring Recursive)
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
 
zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境zend_parse_parametersと64bit環境
zend_parse_parametersと64bit環境
 
PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料PHPカンファレンス2014の懇親会飛び込みLT資料
PHPカンファレンス2014の懇親会飛び込みLT資料
 
PHPの今とこれから2019
PHPの今とこれから2019PHPの今とこれから2019
PHPの今とこれから2019
 
Struts2を始めよう!
Struts2を始めよう!Struts2を始めよう!
Struts2を始めよう!
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
20190809
2019080920190809
20190809
 
FukuokaPHP 3
FukuokaPHP 3FukuokaPHP 3
FukuokaPHP 3
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 

More from Junpei Nakada

家族のために作ったAlexaスキル(JAWS DAYS 2018版)
家族のために作ったAlexaスキル(JAWS DAYS 2018版)家族のために作ったAlexaスキル(JAWS DAYS 2018版)
家族のために作ったAlexaスキル(JAWS DAYS 2018版)Junpei Nakada
 
家族のために作ったAlexaスキル
家族のために作ったAlexaスキル家族のために作ったAlexaスキル
家族のために作ったAlexaスキルJunpei Nakada
 
JAWSUG-santo-2014-Track5-Database
JAWSUG-santo-2014-Track5-DatabaseJAWSUG-santo-2014-Track5-Database
JAWSUG-santo-2014-Track5-DatabaseJunpei Nakada
 
はじめてのAmazon RDS for PostgreSQL
はじめてのAmazon RDS for PostgreSQLはじめてのAmazon RDS for PostgreSQL
はじめてのAmazon RDS for PostgreSQLJunpei Nakada
 
モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方Junpei Nakada
 
クラウドのご紹介
クラウドのご紹介クラウドのご紹介
クラウドのご紹介Junpei Nakada
 
複数サーバでセッションを共有する冴えたやりかた
複数サーバでセッションを共有する冴えたやりかた複数サーバでセッションを共有する冴えたやりかた
複数サーバでセッションを共有する冴えたやりかたJunpei Nakada
 

More from Junpei Nakada (10)

家族のために作ったAlexaスキル(JAWS DAYS 2018版)
家族のために作ったAlexaスキル(JAWS DAYS 2018版)家族のために作ったAlexaスキル(JAWS DAYS 2018版)
家族のために作ったAlexaスキル(JAWS DAYS 2018版)
 
家族のために作ったAlexaスキル
家族のために作ったAlexaスキル家族のために作ったAlexaスキル
家族のために作ったAlexaスキル
 
JAWSUG-santo-2014-Track5-Database
JAWSUG-santo-2014-Track5-DatabaseJAWSUG-santo-2014-Track5-Database
JAWSUG-santo-2014-Track5-Database
 
はじめてのAmazon RDS for PostgreSQL
はじめてのAmazon RDS for PostgreSQLはじめてのAmazon RDS for PostgreSQL
はじめてのAmazon RDS for PostgreSQL
 
モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方
 
Rds徹底入門
Rds徹底入門Rds徹底入門
Rds徹底入門
 
Tagのススメ
TagのススメTagのススメ
Tagのススメ
 
クラウドのご紹介
クラウドのご紹介クラウドのご紹介
クラウドのご紹介
 
PHPで四捨五入
PHPで四捨五入PHPで四捨五入
PHPで四捨五入
 
複数サーバでセッションを共有する冴えたやりかた
複数サーバでセッションを共有する冴えたやりかた複数サーバでセッションを共有する冴えたやりかた
複数サーバでセッションを共有する冴えたやりかた
 

Phpmatsuri2011 LT j_nakada

  • 1. 3B PHP拡張モジュール使ってみた @j_nakada PHP MATSURI 2011
  • 2. 自己紹介 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