サンプルコード 実行結果
Fatal error: Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of foo(). in C:\xampp\htdocs\ t.php on line 8
Fatal error: Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of foo(). in C:\xampp\htdocs\ t.php on line 8
memory 1:160 memory 2:128 memory 3:0個人的な予想に反してforよりforeachの方が省メモリであるという結果が出ました。
1 memory 1:56 memory 2:5324488と、このようにtest1とtest2ではメモリの使用量に大きな差が出ています。
time:0.10538291931152 memory:8653392配列のサンプルコード 実行結果
time:0.01983904838562 memory:8647760と、速度もメモリ使用量も配列のほうがパフォーマンスが高いという結果になりました。
string(21) "arr_object::offsetSet" string(21) "arr_object::offsetSet" string(21) "arr_object::offsetSet" string(24) "arr_object::offsetExists" bool(false) string(21) "arr_object::offsetGet" string(6) "array2" string(23) "arr_object::offsetUnset" arr_object Object ( [container:arr_object:private] => Array ( [0] => array1 [1] => array2 ) )
string(18) "myIterator::rewind" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" 0 => firstelement string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" 1 => secondelement string(16) "myIterator::next" string(17) "myIterator::valid" string(19) "myIterator::current" string(15) "myIterator::key" 2 => lastelement string(16) "myIterator::next" string(17) "myIterator::valid"この結果から分かるように、foreachは
TEST TEST続いてインポートを行う例です。
Parse error: syntax error, unexpected '$f' (T_VARIABLE), expecting identifier (T_STRING) in C:\xampp\htdocs\test.php on line 11さらにインポートの影響が及ぶのは非修飾名および修飾名のみです。
Fatal error: Call to undefined function hoge\test() in C:\xampp\htdocs\test.php on line 10
BenchMark 1 average:0.0053820133209229 BenchMark 2 average:0.0054374217987061と、わずかばかりforの方が速いようです。
BenchMark 1 average:0.0039301872253418 BenchMark 2 average:0.003798246383667と、後者のほうが早かったりします。
namespace1 namespace2 2 subnamespace1 subnamespace2 1 namespace1 namespace2 2このように、名前空間はファイルの相対パス・絶対パスのような扱いができます。
1 2と、このようにnamespace <name> {} でくくった領域では独立した関数名を持つことができます。
$this->:B static:Bサンプルコード2 実行結果
self:A static: Fatal error: Call to private method B::who() from context 'A' in C:\xampp\htdocs\test.php on line 13このように、プロパティがprivateとなりますとstaticは遅延静的束縛ができずにエラーを起こしてしまいます。
self:A static:Bと、このようにselfとstaticで呼び出し先の関数が変わってしまいます。
int(5)果たしてクラスオブジェクトを関数として呼び出すことがあるのでしょうか?
Aクラスを文字列として変換すること自体がまず無いでしょうし、
var1 => value 1 var2 => value 2 var3 => value 3 MyClass::getProperty: var1 => value 1 var2 => value 2 var3 => value 3 protected => protected var private => private var使うかな。使わなそうだなぁ…。
set a to 1 get a 1 Is a set? bool(true) Unset a Is a set? bool(false) get _p Notice: Undefined property via __get(): _p in C:\xampp\htdocs\test.php on line 51 in C:\xampp\htdocs\test.php on line 27と、このように動的にメンバ変数を作成したり、取得・削除も行うことができました。
Hello World!!以上のように、トレイトではメンバ変数とメンバ関数が継承できることが分かりました。
BenchMark 1 average:0.0052475452423096 BenchMark 2 average:0.0050734758377075includeする分autoloadの方が遅いですね。
BenchMark 1 average:0.012288689613342 BenchMark 2 average:0.0055228233337402というわけで、普通の配列の倍以上の時間がかかることが分かりました。
BenchMark 1 average:0.032666206359863 BenchMark 2 average:0.032941651344299これからはパターン1で行こうと思います。
1211パターン1とパターン3、パターン2とパターン4が同じ結果になると思ったのですが、そうはなりませんでした。
array(1) { [1]=> string(1) "d" }上の例は、keyが全て1に型キャストされる例です。
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) } array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }と、このように関数の結果を一次変数に代入しなくても次の関数の引数に設定することができるようになりました。
My name is "MyName". My name is "$name".ちなみに、ヒアドキュメントもNowdocも終了識別子の行で
BenchMark 1 average:0.27803311347961 BenchMark 2 average:0.27166895866394ということで、予想通りNowdocの方が速いという結果になりました。
FLAG1 FLAG3 FLAG5サンプルコード 実行結果
FLAG1 FLAG3 FLAG5と、このように5つの変数に分けて持っていたフラグが一つの変数にまとまりました。
BenchMark 1 average:0.0023561954498291 BenchMark 2 average:0.0024597406387329可読性の問題もありますし素直に複数の変数にフラグを持ったほうがいいですね。
FALSE
NULL : bool(false) "" : bool(false) "0" : bool(false) "a" : bool(true) 0 : bool(false) 1 : bool(true) +1 : bool(true) -1 : bool(true) 0x0A : bool(true) 012 : bool(true) 0.1 : bool(true) 1e3 : bool(true) 1e-3 : bool(true) array("") : bool(false) array("a") : bool(true) array(array("a")) : bool(true) TRUE : bool(true) FALSE : bool(false) object : bool(true) fopen : bool(true)では、肝心のベンチマークを取ってみましょう。
BenchMark 1 average:0.0022930383682251 BenchMark 2 average:0.0024604082107544そして、最後に注意点をひとつ。未定義の変数を判別しようとしますと…。
Notice: Undefined variable: x in C:\xampp\htdocs\test.php on line 2と、Noticeが出てしまいます。
BenchMark 1 average:0.064927673339844 BenchMark 2 average:0.062755298614502やはりstriposの方が速いようです。
BenchMark 1 average:0.0086915016174316 BenchMark 2 average:0.070313191413879 BenchMark 3 average:0.009862232208252 BenchMark 4 average:0.0227707862854こちらも綺麗に結果が出ましたね。
strtr cba abc cba abc str_replace abc abc cba cba preg_replace abc abc cba cbaと、上記のようにstrtrでは配列の順序に関わらず一定の結果を返すのに対し、
BenchMark 1 BenchMark 1 average:0.016364622116089 BenchMark 2 average:0.019233679771423 BenchMark 3 average:0.045470118522644きれいに結果に差が出ましたね。
$str = 'abcde'; substr($str, -1);方法2
$str = 'abcde'; $str{strlen($str)-1};サンプルコード 実行結果
BenchMark 1 average:0.0076918125152588 BenchMark 2 average:0.0067881345748901あんまり差がつきませんでしたね。
bool(true) bool(true) bool(true) bool(true) bool(false) bool(false) bool(false) bool(false)と、文字列のオフセットに数値以外の値を渡した場合、結果はFALSEになります。
scandir array(11) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(9) ".htaccess" [3]=> string(13) "BenchMark.php" [4]=> string(8) "Util.php" [5]=> string(14) "Validation.php" [6]=> string(3) "doc" [7]=> string(3) "git" [8]=> string(9) "index.php" [9]=> string(8) "test.php" [10]=> string(9) "test2.php" } glob array(8) { [0]=> string(13) "BenchMark.php" [1]=> string(8) "Util.php" [2]=> string(14) "Validation.php" [3]=> string(3) "doc" [4]=> string(3) "git" [5]=> string(9) "index.php" [6]=> string(8) "test.php" [7]=> string(9) "test2.php" }上記の結果のように、scandirではカレントディレクトリを表す"."と、親ディレクトリを表す".."、
int(2147483647) float(2147483648) int(-2147483648)と、このような現象が起こる場合もあります。
int(1) int(2) int(2) int(1)ただ、未だに変数の値を入れ替えたい状況というのに出会ったことがありませんw
BenchMark 1 average:0.01190493106842 BenchMark 2 average:0.012681221961975三項演算子は遅いという印象はありましたが
BenchMark 1 average:0.51706559658051 BenchMark 2 average:0.51087384223938この結果を見るには大差無さそうですね。
Array ( [0] => a0 [1] => a1 [2] => a2 [a] => ba [b] => bb [c] => bc [3] => b0 [4] => b1 [5] => b2 ) Array ( [0] => a0 [1] => a1 [2] => a2 [a] => aa [b] => ab [c] => ac )ということで、表にまとめるとこのような感じになります。
数値 | 文字列 | |
---|---|---|
array_merge | 後の配列は後ろに追加 | 後の配列の値で上書き |
+ | 前の配列の値で上書き | 前の配列の値で上書き |
BenchMark 1 average:0.029446578025818 BenchMark 2 average:0.011990690231323やっぱりarray_mergeを使わない方が速いですね。
Warning: Cannot modify header information - headers already sent byと、このようにWarningが発生し、リダイレクトしてくれません。
BenchMark 1 average:1.4885204076767 BenchMark 2 average:1.8529042959213 BenchMark 3 average:0.45898940563202 BenchMark 4 average:0.46037158966064この結果より何度もphpの開閉タグを開いたりechoで直接出力するよりも
BenchMark 1 average:0.51002349853516 BenchMark 2 average:0.5392422914505これですとパターン1の方が速いですね。
BenchMark 1 average:0.25352725982666 BenchMark 2 average:0.099978256225586 BenchMark 3 average:0.10105469226837 BenchMark 4 average:0.10030741691589 BenchMark 5 average:0.099922490119934 BenchMark 6 average:0.098655319213867変数ありの場合
BenchMark 1 average:0.25069181919098 BenchMark 2 average:0.10060927867889 BenchMark 3 average:0.10188813209534 BenchMark 4 average:0.097803926467896 BenchMark 5 average:0.10043952465057HTMLベタ書きが最速なのは当然として、それ以外はあまり差がつきませんでしたね。
BenchMark 1 average:0.10389432907104 BenchMark 2 average:0.50043830871582ピリオドよりもコンマでの連結のほうが速くなると思ったのですが…。
BenchMark 1 average:0.020783019065857 BenchMark 2 average:0.034758615493774速度では圧倒的に「\n」の方が速いですが、
BenchMark 1 average:0.0046348333358765 BenchMark 2 average:0.01211142539978 BenchMark 3 average:0.012383699417114変数と比べて配列は3倍くらい遅いですね。
BenchMark 1 average:0.2620055437088 BenchMark 2 average:0.26266303062439 BenchMark 3 average:0.26184134483337こんな感じでした。
BenchMark 1 average:0.0028216361999512 BenchMark 2 average:0.0024353981018066と、後者のほうが速いです。
BenchMark 1 average:0.11058385372162 BenchMark 2 average:0.11761968135834 BenchMark 3 average:0.11095626354218ローカル変数よりメンバ変数が遅いのはともかくとして、比較するとstaticの方が速いですね。
BenchMark 1 average:0.58168365955353 BenchMark 2 average:0.56918079853058サンプルコード 実行結果
BenchMark 1 average:0.58172357082367 BenchMark 2 average:0.58285653591156今回はここまでです。
BenchMark 1 average:0.014285373687744 BenchMark 2 average:0.013172221183777とまあ、わずかばかり後者のほうが速かったりもします。
FLAG1 FLAG1 FLAG2 FLAG2いかがでしょうか。
BenchMark 1 average:0.010251259803772 BenchMark 2 average:0.0099292039871216サンプルコード 実行結果
BenchMark 1 average:0.10526418685913 BenchMark 2 average:0.10484325885773このような結果になりました。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9いかがでしょうか。
BenchMark 1 average:0.10385200977325 BenchMark 2 average:0.10636031627655自分だけが見るコードでしたら少々トリッキーなこんな書き方もアリではないでしょうか。
array(5) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) } array(5) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) }速度調査もしてみます
BenchMark 1 average:1.6927280902863 BenchMark 2 average:1.0643670082092速度的にも後者のほうが良いですね。
BenchMark 1 average:0.084321331977844 BenchMark 2 average:0.034408354759216速度も問題ありませんね。
NULL : NULL "" : NULL "a" : NULL 0 : int(0) 1 : int(1) +1 : int(1) -1 : int(-1) 0x0A : int(10) 012 : int(10) 0.1 : int(0) 1e3 : int(1000) 1e-3 : int(0) array("") : NULL array("a") : NULL array(array("a")) : NULL TRUE : NULL FALSE : NULL object : NULL fopen : NULL成功です。以降、数値のチェックをする際はこの関数を使って入力チェックを行っていきます。
NULL : array(0) { } "" : array(0) { } "a" : array(0) { } 0 : array(0) { } 1 : array(0) { } +1 : array(0) { } -1 : array(0) { } 0x0A : array(0) { } 012 : array(0) { } 0.1 : array(0) { } 1e3 : array(0) { } 1e-3 : array(0) { } array("") : array(0) { } array("a") : array(1) { [0]=> string(1) "a" } array(array("a")) : array(1) { [0]=> array(1) { [0]=> string(1) "a" } } TRUE : array(0) { } FALSE : array(0) { } object : array(0) { } fopen : array(0) { }ちなみに、実際に使用するときは以下のように判別して使用します。
NULL : string(0) "" "" : string(0) "" "a" : string(1) "a" 0 : int(0) 1 : int(1) +1 : int(1) -1 : int(-1) 0x0A : int(10) 012 : int(10) 0.1 : float(0.1) 1e3 : float(1000) 1e-3 : float(0.001) array("") : string(0) "" array("a") : string(0) "" array(array("a")) : string(0) "" TRUE : bool(true) FALSE : bool(false) object : string(0) "" fopen : string(0) ""
array(19) { ["NULL"]=> NULL [""""]=> string(0) "" [""a""]=> string(1) "a" [0]=> int(0) [1]=> int(1) ["+1"]=> int(1) [-1]=> int(-1) ["0x0A"]=> int(10) ["012"]=> int(10) ["0.1"]=> float(0.1) ["1e3"]=> float(1000) ["1e-3"]=> float(0.001) ["array("")"]=> array(0) { } ["array("a")"]=> array(1) { [0]=> string(1) "a" } ["array(array("a"))"]=> array(1) { [0]=> array(1) { [0]=> string(1) "a" } } ["TRUE"]=> bool(true) ["FALSE"]=> bool(false) ["object"]=> object(stdClass)#2 (0) { } ["fopen"]=> resource(9) of type (stream) }これでテスト時のパターン作成を行う必要がなくなりました。
BenchMark 1 average:1.0819767475128 BenchMark 2 average:1.1022774219513変数ありの場合
BenchMark 1 average:1.1036427974701 BenchMark 2 average:1.1097546815872ダブルクォーテーションでは意図しない変数展開が起きてしまう場合も皆無ではありませんので
BenchMark 1 average:0.87322912216187 BenchMark 2 average:0.88909468650818と、このようにコードの実行速度の比較ができます。
pear channel-discover pear.phpdoc.org
pear install phpdoc/phpDocumentor-alpha
@echo off doskey ls=dir/w $* doskey cat=type $* doskey rm=del $* cd Documents\Xampp\htdocs
git config --global user.name 'your name' git config --global user.email you@example.com
git config --global alias.co checkout git config --global alias.ci commit git config --global alias.st status git config --global alias.last 'log -1 HEAD'