🙌

Php Inspectionsが提案するコードの効果

2021/09/17に公開

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から導入された関数)に変換できますよってことですね。直感的になるので変換しておいて損はなさそうです。ついでにstrposstr_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