Cluster J script 処理時間測定

Cluster J script 処理時間測定
---------soft limit (50ms)  って何?-----------
測定してみたところの体験と
エラーメッセージの考察と提案です
ここ最近(12月~2月) こういう黄色の警告をみかけました

> WARN: script execution (383ms) exceeded the soft limit (50ms). The limit will be enforced in the future.
直訳すると
> 警告: スクリプトの実行 (383 ミリ秒) がソフト制限 (50 ミリ秒) を超えました。 この制限は将来的に施行される予定です。
もちろん、ワールド制作者だけに見えるコンソールに表示される警告ですね
scriptの処理時間が長いという警告なので
どういう場合にその警告がでるのか、無視して支障ないのか
script を改善して残すべくscript の処理時間をまず測定してみました
・・・・図参照
実験方法---------
Date.now()
このコマンドで時刻を調べて その差から処理時間を算出します
それを発展させて調査用の script に改造していきました
ループ回数を徐々に多くして処理時間が長くなったら例の黄色の警告がでるはずです
ところがこの黄色の警告がなかなか再現できずに苦労しました
代わりに赤!マークのエラーが出ることもあります
 [Script has allocated too much memory]
 
調査用の script をつくったときに
驚いたのは scriptが途中で放棄されていることでした
文末に 処理時間の表示を書いていたのですが 
負荷を重くしてエラーを出した場合に その処理時間が表示されないので、
おかしいと気づきました
それは本番Clusterの場合だけの現象でした
Unity上のpreviewでは そんな途中放棄はありませんでした
previewとは かおもさんの(CSEmulator2.20)を使用したということです)
本番Clusterつまり、サーバーに「ワールドをアップロード」して入室して測定すると
ワールドは落ちずに続行されているのは良いのですが
Scriptが途中で実行が放棄されているではありませんか
Scriptを作る立場からすると 許しがたい行為ですね
スパイクが生じてでも文末まですべて実行するのがルールだと思っていました
実験-----------------
さて、計測Scriptを修正して前進することにします。
エラーでいつ中断されてもいいように
負荷ループごとに処理時間を表示するように修正しました
ようやく調査用のscriptとギミックができました
この調査用のシーンで実験したところ エラーと警告を再現できるようになりました
負荷が ギリギリだと 赤!マークのエラーが出ます 
[Script has allocated too much memory]
負荷を大きくすると 黄色の警告も出現しはじめました
WARN: script execution (51ms) exceeded the soft limit (50ms). The limit will be enforced in the future.
しかし、どのscriptの何行目でerrorかというヒントも表示されず不便です
エラーのでる負荷を記録してもマチマチな値で 調査しにくいです
 

もしも、かおもさんのエミュレータがなければ
unity editor上で profiler分析ができません
するとこんな手探りしかできないのではないでしょうか

 

負荷を変えて測定して 10回づつ測定しました
scriptが最終行まで実行されたら◯
errorが出たらxとしました
数字は scriptが処理にかかった時間です

負荷が小さく16ms以内ならリニアな関係だろうと予想できます
負荷が大きくなれば16msを境に x ばかりと予想しましたが
測定では 負荷が大きくなると 結果がばらついて
ラチがあきません  再現性がなさすぎます

 
 考察-----------------
そもそも 処理時間なら Unity profilerで分析したほうが
よいと思い出しました
Clusterのこの警告とerrorは いずれも
profilerが使えないという前提で
 [スパイクを簡易的に表現しようとしている]
・・・のではないかと思い当たりました
・・・・図参照

 

この赤!マークのエラー  を考察してみます
 [Script has allocated too much memory]
直訳では「メモリーをたくさん喰っています」という文ですが
いままでも 入室の最初に見かけることが多く 実態に合わない的外れなエラーという印象でした
おそらく言葉どおりの意味ではなく 出現するタイミングから 黄色警告と同じような
「処理時間が長いよ」という意味に解釈したほうがいいように思います
あるいは 分類不能なエラーは何でもこれに紐づけしているのかもしれません
そういえば Unity profilerで観察しているとplay game直後に スパイクが生じがちなので
結局 スパイクを表現しようとしていると勝手に解釈しています
(個人の見解です。検証実験や文献上の根拠はありません)

この黄色の警告を考察してみます
> WARN: script execution (383ms) exceeded the soft limit (50ms). 
1つのscriptの処理時間ではなく 複数のスクリプトの合計
たぶん ワールド全体の処理時間を意味しているようです
だとすると どのスクリプトの何行目なのかという 情報は期待できないかもしれません

未解決なことが多々あります
 soft limit (50ms)     hard limit (500ms)の意味が不明です
ソフトウエア上の制限とハードウエア上の制限でしょうか
単にゆるい制限ときつい制限という意味でしょうか
「将来的に施行される予定」とか 500msに緩和されたとか 
よくわからないことが多々ありますが 報告を一旦ここまでとします
考察はいくつかの実験から仮説を立てたもので 文献上の裏付けがありませんので誤解なきように
提案------------------
ここでさらに稚拙な提案をしておきます
別の開発環境ではlua言語で nilトラップ というテクニックがありました
「ユーザーの作ったscriptを中断するならば
処理時間が制限を超えた時に何らかの信号を出して 
ユーザーがそれにトラップをかけて
対策処理を書けるようにしたらどうでしょうか」
処理時間を短くしろという警告だけでは工夫が足りないように思います


・・以上  測定の体験と考察と提案です
なお専門家ではないので理解に間違いがあればお許しください


環境    CCK2.8.0      かおもさんのエミュレータ(CSEmulator2.20)  

  

測定用の scriptとuntityデータを置きました
https://drive.google.com/file/d/1pnkYNNRRa1jhXuPtkqwuxpBgsYMdiGAX/view?usp=sharing
test_ms_009.unitypackage
test_ms_009_readme.txt
この2つを含む zipファイルです

#cluster #ClusterScript