Php Inspectionsが提案するコードの効果
intval
コード
intval('1');
内容
[EA] '(int) '1'' can be used instead (reduces cognitive load, up to 6x times faster in PHP 5.x).
提案によるとintval('1')
と書くより、(int)'1'
と書いたほうが認知負荷を減らし速度が上がるみたいです。
各バージョンで試してみます。
検証コード
<?php
$sum = 0;
for ($count = 0; $count < 5; $count++) {
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
intval('1');
or
(int)'1';
}
$end = microtime(true);
$time = $end - $start;
echo $count + 1 . '回目: ' . $time . "\n";
$sum += $time;
}
echo 'avg: ' . $sum / 5 . "\n";
結果
メジャーリリースごとにそれぞれ速度が上がってることがわかります。とくに5.x系から7.x系はかなり速度が上がっています。intval
(int)
は5.x系だと提案通り多少キャストの方が早いみたいですが、7.x・ 8.xはあまり変わりがないみたいです。php8.xを使っているならintval
(int)
どちらでも良さそうですね。
PHP 5.6.40
intval
1回目: 0.17253398895264
2回目: 0.17258191108704
3回目: 0.17502903938293
4回目: 0.18069791793823
5回目: 0.17169499397278
avg: 0.17450757026672
(int)
1回目: 0.11829090118408
2回目: 0.11972689628601
3回目: 0.11875891685486
4回目: 0.119215965271
5回目: 0.12356805801392
avg: 0.11991214752197
PHP 7.4.23
intval
1回目: 0.034770965576172
2回目: 0.031754970550537
3回目: 0.03233790397644
4回目: 0.033279895782471
5回目: 0.031260967254639
avg: 0.032680940628052
(int)
1回目: 0.035022974014282
2回目: 0.031970977783203
3回目: 0.033596992492676
4回目: 0.032189130783081
5回目: 0.031347036361694
avg: 0.032825422286987
PHP 8.0.10
intval
1回目: 0.020873069763184
2回目: 0.019361019134521
3回目: 0.019352912902832
4回目: 0.019692897796631
5回目: 0.019168138504028
avg: 0.019689607620239
(int)
1回目: 0.02030611038208
2回目: 0.019237041473389
3回目: 0.019836902618408
4回目: 0.01869010925293
5回目: 0.018357038497925
avg: 0.019285440444946
strval
コード
strval(1);
内容
[EA] '(string) 1' can be used instead (reduces cognitive load, up to 6x times faster in PHP 5.x).
提案によるとstrval(1)
と書くより、(string) 1
と書いたほうが認知負荷を減らし速度が上がるみたいです。
各バージョンで試してみます。
検証コード
<?php
$sum = 0;
for ($count = 0; $count < 5; $count++) {
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
strval(1);
or
(string)1;
}
$end = microtime(true);
$time = $end - $start;
echo $count + 1 . '回目: ' . $time . "\n";
$sum += $time;
}
echo 'avg: ' . $sum / 5 . "\n";
結果
こちらも同様にメジャーリリースごとにそれぞれ速度が上がってるおり、とくに5.x系から7.x系はかなり速度が上がっています。strval
(string)
も同様に5.x系だと多少キャストの方が早いみたいですが、7.x・ 8.xはあまり変わりがないみたいです。php8.xを使っているならstrval
(string)
どちらでも良さそうですね。
PHP 5.6.40
strval
1回目: 0.20829200744629
2回目: 0.20586204528809
3回目: 0.20502901077271
4回目: 0.20353293418884
5回目: 0.20102095603943
avg: 0.20474739074707
(string)
1回目: 0.15831208229065
2回目: 0.15768599510193
3回目: 0.15497708320618
4回目: 0.16005897521973
5回目: 0.15805006027222
avg: 0.15781683921814
PHP 7.4.23
strval
1回目: 0.022080898284912
2回目: 0.023039102554321
3回目: 0.02265191078186
4回目: 0.023183107376099
5回目: 0.022326946258545
avg: 0.022656393051147
(string)
1回目: 0.025052070617676
2回目: 0.021100997924805
3回目: 0.021815061569214
4回目: 0.022439002990723
5回目: 0.022020816802979
avg: 0.022485589981079
PHP 8.0.10
strval
1回目: 0.013239860534668
2回目: 0.010821104049683
3回目: 0.011523008346558
4回目: 0.011029958724976
5回目: 0.011110782623291
avg: 0.011544942855835
(string)
1回目: 0.01157808303833
2回目: 0.011814117431641
3回目: 0.010937929153442
4回目: 0.011354923248291
5回目: 0.011489152908325
avg: 0.011434841156006
array_push
コード
array_push($array, 1);
内容
[EA] '$array[] = 1' here would be up to 2x faster.
提案によると$array[] = 1
にすることで最大で2倍の速さになるらしいです。
各バージョンで試してみます。
検証コード
<?php
$sum = 0;
$array = [];
for ($count = 0; $count < 5; $count++) {
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
array_push($array, 1);
or
$array[] = 1;
}
$end = microtime(true);
$time = $end - $start;
echo $count + 1 . '回目: ' . $time . "\n";
$sum += $time;
}
echo 'avg: ' . $sum / 5 . "\n";
結果
メジャーリリースごとにそれぞれ速度が上がってるおり、とくに5.x系から7.x系はかなり速度が上がっています。また、array_push
より[] =
の方が速いことが分かります。どのバージョンを使用していても置き換えられる場合は[] =
の方がいいですね。
PHP 5.6.40
array_push
1回目: 0.029506921768188
2回目: 0.028934001922607
3回目: 0.031949996948242
4回目: 0.03052806854248
5回目: 0.028785943984985
avg: 0.029940986633301
[] =
1回目: 0.022809028625488
2回目: 0.018320083618164
3回目: 0.027341842651367
4回目: 0.018018007278442
5回目: 0.018795013427734
avg: 0.021056795120239
PHP 7.4.23
array_push
1回目: 0.0068550109863281
2回目: 0.0038821697235107
3回目: 0.0081651210784912
4回目: 0.0033550262451172
5回目: 0.0034070014953613
avg: 0.0051328659057617
[] =
1回目: 0.0061531066894531
2回目: 0.0036470890045166
3回目: 0.0069069862365723
4回目: 0.0021011829376221
5回目: 0.0021071434020996
avg: 0.0041831016540527
PHP 8.0.10
array_push
1回目: 0.0070209503173828
2回目: 0.004551887512207
3回目: 0.0078310966491699
4回目: 0.0029170513153076
5回目: 0.0029010772705078
avg: 0.005044412612915
[] =
1回目: 0.004878044128418
2回目: 0.0022280216217041
3回目: 0.0082650184631348
4回目: 0.0019481182098389
5回目: 0.0019600391387939
avg: 0.0038558483123779
Strpos
コード
strpos($string, 'te') === 0
内容
'strpos' call can be converted to 'str_starts_with'
これは単にstr_starts_with
(php8から導入された関数)に変換できますよってことですね。直感的になるので変換しておいて損はなさそうです。ついでにstrpos
とstr_starts_with
の速度を測ってみます。
検証コード
<?php
$sum = 0;
$string = 'test';
for ($count = 0; $count < 5; $count++) {
$start = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
strpos($string, 'te') === 0;
or
str_starts_with($string, 'te');
}
$end = microtime(true);
$time = $end - $start;
echo $count + 1 . '回目: ' . $time . "\n";
$sum += $time;
}
echo 'avg: ' . $sum / 5 . "\n";
結果
str_starts_with
の方が速いみたいです。strpos
を前方一致として利用している場合は、str_starts_with
に置き換えた方が、速度・可読性ともに良くなりそうです。
PHP 8.0.10
strpos
1回目: 0.047184944152832
2回目: 0.048396825790405
3回目: 0.049944877624512
4回目: 0.047793865203857
5回目: 0.048421144485474
avg: 0.048348331451416
str_starts_with
1回目: 0.026616811752319
2回目: 0.025768995285034
3回目: 0.026998043060303
4回目: 0.026855945587158
5回目: 0.026201009750366
avg: 0.026488161087036
Discussion