今回は処理におけるちょっとシビアな話です.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.4
スポンサーリンク
ショートカットは「遅い」
レシピによっては感じにくいですが, そもそもショートカットの各アクションは世間一般の高級言語と比べるととても遅いです.
PCで行えばμSec~mSec単位で終わる作業も, その1000倍も10000倍もかかってしまいます.
マイコンをはじめ, USBでも1mSec(=0.0001Sec)を一区切りに様々な処理を行うくらいですからね.
そのためシンプルな処理であれば多少我慢すれば済みますが, 一つの処理が長かったり(例:Webへのアクセス), 繰り返し回数が多かったり, あるいはその混合となるととてもじゃないですが待ってられなくて作るのを断念…なんて最悪もありえます.
ショートカットにそのような処理を任せるのが筋違いと言われればそれまでですが.
しかしショートカットはショートカットで他の手段でやるとめんどくさい、難しいことも可能です.
実際に計ってみる
実際にどれだけかかるのか, おおよその時間を計算してみました.
時間計測はフォーマットを変更することで分だけ, 秒(ミリを含む)だけを取り出すことが可能なのでこれを使います.
先日の投稿で触れたように, 処理次第ではショートカットの数を減らすことが可能です.
画像の場合, 辞書の値を得るのに必ずしも「辞書の値を取得」は必要ありません.
じゃあこういったアクション数の増減は処理時間にどの程度の影響をもたらすのか, 気になるところですよね.
サンプル
というわけで特定のアクションの有無による全体の処理時間の変化を調べてみます.
今回は一番使う使わないが分かれがちな「変数を設定」アクションです.
ショートカットにおける時間測定は先程紹介した過去記事の通りですが, それでも最小単位が1mSecなので, フローの通り「繰り返す」で1万回繰り返した時間を測定することで誤差をある程度減らすことにします.
実際に計測される対象は画像で暗くした部分ですね.
画像では「変数を設定」が入った状態ですがこの状態で計測した場合をこれを取り除いた状態の2通りをそれぞれ200回計測しました.
その結果が上の画像です.
思ったより結果にブレが少ないですね.
箱ひげの具体的な値は以下になります(単位はSec).
「変数を設定」あり | なし | |
---|---|---|
最小値(Q0) | 21.963 | 14.161 |
Q1 | 22.20125 | 14.6955 |
中央値(Q2) | 22.3945 | 14.8785 |
Q3 | 22.65775 | 14.98625 |
最大値(Q4) | 23.477 | 15.425 |
よって1回あたりの処理時間で書き直すと以下になります(単位はmSec).
「変数を設定」あり | なし | |
---|---|---|
最小値(Q0) | 2.1963 | 1.4161 |
Q1 | 2.220125 | 1.46955 |
中央値(Q2) | 2.23945 | 1.48785 |
Q3 | 2.265775 | 1.498625 |
最大値(Q4) | 2.3477 | 1.5425 |
「変数を設定」ありの場合は「繰り返す」と「変数を設定」の合計時間であり, なしの場合は前者のみと考えることができます.
なのでこの差を取ることで「変数を設定」アクションの1回あたりの処理時間をみなすことができます.
それぞれ別に計っているので個別で評価はできませんが, 中央値から評価しておよそ0.7516mSecと推定されます.
なので「変数を設定」が1つ処理されるだけでも1mSec弱かかるわけです.
アクション数(正しくは実際に実行される数)が少なければいいですが, 繰り返しのアクションでしかも回数が多くなればなるほどこの1mSec弱がどんどん積み重なっていきます.
〆
このおよそ0.75mSecという時間は, 数回程度ならたかが知れる時間なので普通に使う範囲であれば気にせず使っても問題ありません.
しかしこれが繰り返し処理の中で使われると無視できない場合が生じます.
実際繰り返し回数が1334回と仮定すると, この「変数を設定」アクションだけで約1秒の時間を消費する計算になります.
人間の感覚での1秒は大きいですよね.
あると便利なアクションだったりするわけですが処理時間を重視する場合は最終的にこういったリスクを取り除く工夫も必要になってくるということです.