狠狠撸

狠狠撸Share a Scribd company logo
三項演算?を?ると
「ウッ」
てなる?のはなし
PHPerKaigi Online #1
2020.03.27
Yuta Ohashi
三項演算?を?ると
「ウッ」
てなる? ?
blue_goheimochi
?橋 佑太
株式会社オウケイウェイヴ
PHP(Laravel), Javascript(Vue.js/Nuxt.js),
Laravel JP Conference 2020,
PHPerKaigi 2020,
サッカー, フットサル, 浜松まつり,
ポケカ, さわやかのげんこつハンバーグ
おおはし ゆうた
44
例:商品ステータス判定
<?php
$status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
<?php
$status = $hasItem
? $isOpened
? "OK"
: "NG"
: "NG";
55
例:商品ステータス判定
<?php
$status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
<?php
$status = $hasItem
? $isOpened
? "OK"
: "NG"
: "NG";
ぱっと?で
どういう条件かわからない???
66
例:商品ステータス判定
<?php
$status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
<?php
$status = $hasItem
? $isOpened
? "OK"
: "NG"
: "NG";
ぱっと?で
どういう条件かわからない???
ネストはそれはそれで
わらからない???
书き换える
88
例:商品ステータス判定
<?php
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
<?php
$status = ($hasItem && $isOpened) ? "OK" : "NG";
デフォルトをNGにしとく
99
例:商品ステータス判定
<?php
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
<?php
$status = ($hasItem && $isOpened) ? "OK" : "NG";
デフォルトをNGにしとく
OKになる条件だけifで指定
1010
例:商品ステータス判定
<?php
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
<?php
$status = ($hasItem && $isOpened) ? "OK" : "NG";
デフォルトをNGにしとく
OKになる条件だけifで指定
このくらいなら三項演算?使ってても
分かりやすさがある
1111
例:商品ステータス判定
<?php
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
<?php
$status = ($hasItem && $isOpened) ? "OK" : "NG";
デフォルトをNGにしとく
OKになる条件だけifで指定
そのくらいなら三項演算?使ってても
分かりやすさはある
?の好みによるところも?きい
(育ってきた環境とか違うとすれ違うよね)
(個?的な想いとしては)
冗?でもいいから
分かりやすくかいてほしいが
強く?えない
そうだパフォーマンスを
調べればいいんだ!
そうだパフォーマンスを
調べればいいんだ!
1515
<?php
$loop = $argv[1];
$result = [
"OK" => 0,
"NG" => 0,
];
for ($i=0; $i<$loop; $i++) {
$hasItem = rand(0, 1) == 1;
$isOpened = rand(0, 1) == 1;
$status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
$result[$status]++;
unset($status);
}
echo "Finish?n";
echo "----------?n";
echo "loop: " . $loop . "?n";
echo "result: OK: " . $result["OK"] . " NG: " . $result["NG"] . "?n";
echo "----------?n";
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
1616
<?php
$loop = $argv[1];
$result = [
"OK" => 0,
"NG" => 0,
];
for ($i=0; $i<$loop; $i++) {
$hasItem = rand(0, 1) == 1;
$isOpened = rand(0, 1) == 1;
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
$result[$status]++;
unset($status);
}
echo "Finish?n";
echo "----------?n";
echo "loop: " . $loop . "?n";
echo "result: OK: " . $result["OK"] . " NG: " . $result["NG"] . "?n";
echo "----------?n";
雑にパフォーマンスを調べる
test02.php ? 三項演算?を使わない場合
ループ回数
1回?10億回まで調査
1818
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 1
Finish
----------
loop: 1
result: OK: 1 NG: 0
----------
real 0.03
user 0.01
sys 0.00
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1
Finish
----------
loop: 1
result: OK: 0 NG: 1
----------
real 0.04
user 0.02
sys 0.00
test02.php ? 三項演算?を使わない場合
1919
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 10
Finish
----------
loop: 10
result: OK: 2 NG: 8
----------
real 0.02
user 0.01
sys 0.00
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10
Finish
----------
loop: 10
result: OK: 4 NG: 6
----------
real 0.04
user 0.02
sys 0.00
test02.php ? 三項演算?を使わない場合
2020
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 100
Finish
----------
loop: 100
result: OK: 20 NG: 80
----------
real 0.04
user 0.00
sys 0.02
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100
Finish
----------
loop: 100
result: OK: 23 NG: 77
----------
real 0.04
user 0.01
sys 0.01
test02.php ? 三項演算?を使わない場合
2121
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 1000
Finish
----------
loop: 1000
result: OK: 263 NG: 737
----------
real 0.05
user 0.02
sys 0.01
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000
Finish
----------
loop: 1000
result: OK: 259 NG: 741
----------
real 0.02
user 0.01
sys 0.00
test02.php ? 三項演算?を使わない場合
2222
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 10000
Finish
----------
loop: 10000
result: OK: 2481 NG: 7519
----------
real 0.05
user 0.01
sys 0.02
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10000
Finish
----------
loop: 10000
result: OK: 2526 NG: 7474
----------
real 0.04
user 0.02
sys 0.00
test02.php ? 三項演算?を使わない場合
2323
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 100000
Finish
----------
loop: 100000
result: OK: 25039 NG: 74961
----------
real 0.06
user 0.02
sys 0.02
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100000
Finish
----------
loop: 100000
result: OK: 24951 NG: 75049
----------
real 0.15
user 0.04
sys 0.00
test02.php ? 三項演算?を使わない場合
2424
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 1000000
Finish
----------
loop: 1000000
result: OK: 249859 NG: 750141
----------
real 0.33
user 0.31
sys 0.00
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000000
Finish
----------
loop: 1000000
result: OK: 249445 NG: 750555
----------
real 0.46
user 0.21
sys 0.00
test02.php ? 三項演算?を使わない場合
2525
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 10000000
Finish
----------
loop: 10000000
result: OK: 2500307 NG: 7499693
----------
real 1.98
user 1.93
sys 0.02
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10000000
Finish
----------
loop: 10000000
result: OK: 2499460 NG: 7500540
----------
real 2.13
user 2.07
sys 0.02
test02.php ? 三項演算?を使わない場合
2626
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 100000000
Finish
----------
loop: 100000000
result: OK: 25010943 NG: 74989057
----------
real 19.66
user 19.34
sys 0.07
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100000000
Finish
----------
loop: 100000000
result: OK: 25000619 NG: 74999381
----------
real 19.67
user 19.51
sys 0.09
test02.php ? 三項演算?を使わない場合
2727
% docker-compose run --rm php-cli time -p php ternary-operator/test01.php 1000000000
Finish
----------
loop: 1000000000
result: OK: 250032439 NG: 749967561
----------
real 196.47
user 195.49
sys 0.33
雑にパフォーマンスを調べる
test01.php ? 三項演算?を使った場合
% docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000000000
Finish
----------
loop: 1000000000
result: OK: 250021250 NG: 749978750
----------
real 209.85
user 207.77
sys 1.05
test02.php ? 三項演算?を使わない場合
2828
雑にパフォーマンスを調べる
test01.php 1 2 3 4 5 6 7 8 9 10 平均
1回 0.03 0.03 0.02 0.02 0.04 0.05 0.05 0.04 0.05 0.02 0.035
10回 0.02 0.05 0.05 0.14 0.02 0.02 0.04 0.03 0.02 0.02 0.041
100回 0.04 0.03 0.03 0.02 0.04 0.03 0.02 0.02 0.05 0.05 0.033
1000回 0.05 0.02 0.14 0.04 0.03 0.04 0.04 0.02 0.06 0.04 0.048
1万回 0.05 0.03 0.03 0.02 0.02 0.02 0.05 0.03 0.04 0.05 0.034
10万回 0.06 0.15 0.05 0.07 0.04 0.07 0.06 0.06 0.07 0.06 0.069
100万回 0.33 0.21 0.24 0.22 0.22 0.23 0.23 0.21 0.2 0.34 0.243
1000万回 1.98 1.84 1.78 1.82 1.92 1.88 2 1.81 2.06 3.61 2.07
1億回 19.66 17.46 17.32 17.36 17.27 17.35 17.39 17.3 17.51 17.52 17.614
10億回 196.47 183.12 190.1 204.81 173.54 174.8 176.23 188.99 190.94 182.66 186.166
縦: loop回数 横: 実?回数
2929
雑にパフォーマンスを調べる
test02.php 1 2 3 4 5 6 7 8 9 10 平均
1回 0.04 0.14 0.03 0.02 0.02 0.05 0.02 0.03 0.04 0.04 0.043
10回 0.04 0.02 0.03 0.03 0.02 0.02 0.02 0.05 0.02 0.02 0.027
100回 0.04 0.02 0.02 0.02 0.03 0.02 0.04 0.02 0.04 0.05 0.03
1000回 0.02 0.04 0.12 0.04 0.03 0.02 0.03 0.04 0.04 0.04 0.042
1万回 0.04 0.05 0.03 0.04 0.04 0.03 0.03 0.03 0.03 0.03 0.035
10万回 0.15 0.14 0.04 0.05 0.05 0.05 0.06 0.05 0.05 0.06 0.07
100万回 0.46 0.22 0.2 0.21 0.2 0.21 0.22 0.21 0.24 0.23 0.24
1000万回 2.13 1.69 1.72 1.72 1.75 1.78 1.76 1.75 1.81 1.76 1.787
1億回 19.67 16.33 16.74 16.44 16.58 16.45 16.5 16.65 16.63 16.71 16.87
10億回 209.85 165.94 172.02 171.37 174.32 170.2 163.97 164.31 164.8 163.44 172.022
縦: loop回数 横: 実?回数
3030
雑にパフォーマンスを調べる
test1.php test2.php 差分
1回 0.035 0.043 -0.008
10回 0.041 0.027 0.014
100回 0.033 0.03 0.003
1000回 0.048 0.042 0.006
1万回 0.034 0.035 -0.001
10万回 0.069 0.07 -0.001
100万回 0.243 0.24 0.003
1000万回 2.07 1.787 0.283
1億回 17.614 16.87 0.744
10億回 186.166 172.022 14.144
3131
0
20
40
60
80
100
120
140
160
180
200
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000
三項演算?を使った場合と使わない場合の実?時間
test1.php test2.php
雑にパフォーマンスを調べる
3232
0
20
40
60
80
100
120
140
160
180
200
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000
三項演算?を使った場合と使わない場合の実?時間
test1.php test2.php
雑にパフォーマンスを調べる
ほらー三項演算?使わない?が
パフォーマンスいいでしょー?
3333
0
20
40
60
80
100
120
140
160
180
200
1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000
三項演算?を使った場合と使わない場合の実?時間
test1.php test2.php
雑にパフォーマンスを調べる
ほらー三項演算?使わない?が
パフォーマンスいいでしょー?
(そういう話ではない)
3434
調査結果
? 1億回ループさせないと差が顕著にならない
? 現実にそんなユースケースは存在しない
? 誤差の範囲
? Webアプリケーションの場合においては
? バッチとか重めの処理する場合には少し考慮しても
よいかも
三項演算?を
禁?したいわけではない
https://twitter.com/tadsan/status/1243531504459759622
3737
例:商品ステータス判定
<?php
$status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
<?php
$status = $hasItem
? $isOpened
? "OK"
: "NG"
: "NG";
ぱっと?で
どういう条件かわからない???
ネストはそれはそれで
わらからない???
3838
例:商品ステータス判定
<?php
$status = "NG";
if ($isOpened && $hasItem) {
$status = "OK";
}
<?php
$status = ($hasItem && $isOpened) ? "OK" : "NG";
デフォルトをNGにしとく
OKになる条件だけifで指定
このくらいなら三項演算?使ってても
分かりやすさがある
「分かりやすさ」が?事
叁项演算子を见ると「ウッ」てなる人のはなし
1章 理解しやすいコード
コードは理解しやすく
なければいけない。
コードは他の?が最短時間で
理解できるように
書かなければいけない。
7章 制御フローを読みやすくする
7.3 三項演算?
?数を短くするよりも、
他の?が理解するのに
かかる時間を短くする。
基本的には if/else を使おう。
三項演算?はそれによって
簡潔になる時にだけ使おう。
解説
他の?に読んでもらう
?分が書いたコードを
?に読んでもらうということは、
読みやすいコードを書くための
とてもいい機会になる
仲間にも本書を読んでもらって、
どうすれば読みやすいコードに
なるかを共有しておくのがいい。
仲間と?緒に実践できるとなおいい。
「分かにくいコード」がいい
という?はきっといないでしょう
?分??が
「理解しやすいコード」を
意識的に書き
仲間と
「理解しやすいコード」の
共通認識をつくる
5353
まとめ
? 三項演算?は適材適所で使う
? 理解しやすいコードを書くように?がける
? ?分で説明できるとなおよし
? 「なぜ理解しやすいコードだと思うのか?」を
チームメンバーと話して共通理解をつくってい
く

More Related Content

叁项演算子を见ると「ウッ」てなる人のはなし