流れる時(とき)ー ホストマシン負荷状況測定

開発:さて。

基盤:GShell採番だけして何も着手しなかったのは初めてでしたね。

社長:まあ色々忙しくて😄

開発:まずは要件を洗い出すことが重要というか。

社長:とにかく時というのはこの世界の一番重要な軸の一つなわけです。ほとんど全ての物事は、時で駆動されている。これをいかに表示し入力するかというのは、当たり前の事のようですが、本質的な課題です。

開発:時にまつわる全ての計算を統合したいですね。検索とかも。

基盤:タイムスタンプ付きの電子署名もそのつながりですね。

社長:時というのは勝手に流れます。エネルギーを使わずに。なんだか不思議です。相対論的には流速は視点によりますが、止まったり逆行したりはしない。

開発:表示についてはなんだか流れるような感じが醸せると良いかもです。

基盤:砂時計とかは流れます😄

社長:アナログ的な表示は流れてる感じがします。バー表示なんかはその類型。

開発:時計はオブジェクト化したいですね。ユーザは複数の時をクローンする。それぞれの内部では時が進んでいて、いろんな周期で、いろんな情報を、いろんなビューで表示する。

社長:そろそろ何か作りましょう。

開発:ではまず最初の一歩。現時刻の表示。

社長、基盤:おおーっ😃

開発:どんなささいなものでも動くものはなんかうれしいですよね。

社長:これは10ミリ秒インターバルですが、1ミリ秒の桁の値が動くということはそれだけズレがあるわけか。

開発:この値は少しずつ大きくなっていくので、JavaScriptのsetIntervalは前の時間から相対時間で動くものようです。なので、処理に時間がかかると徐々に遅れていく。次のトリガー発生の絶対時間を毎回指定すると良いと思いますが、それだとちょっと処理が重くなるかも知れない。

基盤:マシンの負荷の観測に使えそうですね。

社長:ずれを表示してみましょう。

開発:インターバル時間x回数と、実際の経過時間との差… あれ?蓄積しない😅

社長:人間の思い込みって面白いですね😄。というか所定の時刻より早くなることもあるのが面白い。誤差範囲は?

基盤:誤差が徐々に蓄積していって、1000msを超えそうになったらリセットしているようにも見えます。

開発:誤差範囲を表示… あれ?ずれがマイナスにならなくなった。関数内の動的局所変数を静的変数として使ってたみたいです。スタック上のゴミと比較してたというか🤣。普通の言語なら初期化されてない変数の使用とか警告が出るところだと思うんですが。JavaScriptっていったい…

社長:ウォーミングアップは順調ですね😁

開発:うーん、20分ばかり走らせていたら誤差が100ミリ秒を超えました。結局最初の想像が正しかったのかも。

社長:まあインターバルタイマーを使って時間を作るわけでは無いし、これはとりあえずそういう感じなのかなくらいで。

基盤:ただ、他に重い処理をさせるとどんとズレが増えるようなので、やはり負荷の推定に使えそうですね。マシン全体というよりそのブラウザのスケジューリング内でかも知れませんが。1秒ごととか定期的にズレをリセットして、それぞれの期間の中でのズレつまり負荷を見るとよさそうに思います。

開発:負荷変動をグラフにするのも面白いですね。あれ?あそうか、ウィンドウが表示されてない状態ではそのウィンドウの中のJavaScriptのインターバルタイマーも止まるもよう。そりゃ当然かな?となると継続的な負荷モニターは難しいですね。

* * *

開発:いやあ、ちょっとハマりました。ウィンドウが表示されていない時にはインターバルタイマーが止まるのだと思って、表示再開された時にリセットするようにしたのですが、なにやらうまくいかない。すごく不思議で。で、コンソールにログを出してようやくわかったのは、ウィンドウが非表示でも全く止まるわけではなく、1秒毎にハンドラを呼ぶんですね。まあChromeの固有の仕様かも知れませんが。なんにしろ document.hidden の時のインターバルタイマーはあてにならないという少なくとも一例があるわけなので、そういう判定をして対処することにしました。で、やれやれと思ったら今度はウィンドウのリサイズ中にも止まる。これって、タイマーのハンドラに、これは定刻の呼び出しじゃないよみたいな状況判別情報が渡ってきてるといいんですけどね。

社長:今日はさっそくいろいろと洗礼を浴びましたね😁

基盤:いやこれ、他のブラウザでimgurをリロードするととたんにズレの値がごんと数倍に、100msを超えたりして、負荷状況の推定に使えるんじゃないですかね。

社長:昔から負荷状況に使われてるロードアベレージっていうのは、今のコンピュータだと実際のアプリの反応状況と対応しなくなってますよね。実際のアプリの実行にどの程度の遅延が発生するかっていう情報は、役に立つ負荷情報かなと思います。負荷が重いようなら自分の処理を自粛するとかも出来ますね。

開発:JavaScriptからホストの負荷情報を取れると良いのですが、それはそれでセキュリティの問題だかで使えなくなってるみたいで。

基盤:iPhoneのブラウザでやるとこうなりますね。

開発:あれー、なんか遅延が、リセットされるまで単調に増加してますね… なにやら別の問題か…

社長:これって、各プラットフォームの処理性能やリアルタイム性能をざっくり比較するベンチマークにもなりそうです。

基盤:結局、時の表示とは全然違う方向に来てしまいました😁

社長:時の情報は色んな事に関わるということを改めて実感したといいますか。

開発:次はこれ、負荷状況をグラフにしたいですね。

-- 2022-0122 SatoxITS