Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

パフォーマンス測定の機能(案) #986

Merged
merged 1 commit into from May 18, 2021

Conversation

weyk
Copy link
Contributor

@weyk weyk commented May 7, 2021

「実行速度優先」と似た動きで生成するコード自体が変化ことで、パフォーマンス測定を行うようになります。
一応、以前にパフォーマンスモニタの情報が欲しいと言っていた内容と重なります。
(WebWorkerの内容は取れません。メインスレッドとは別にWebWorkerのglobalに保存されるので参照するには転送が必要)
実際、手元ではこの実装であれやこれやしてました。
・「ユーザ関数」「システム関数」「システム関数本体」の3種、
・呼び出し回数、総時間、最小時間、最大時間が取得可能(回数と総時間から平均は算出可能。欲しい気のする中央値等は不可)
システム関数とシステム関数本体の差は、前者は呼び出すための準備しコードを含む時間、後者は__v0"hoge"のみの時間。
・実行速度優先と同様、コンパイル時の記載場所に従い対象が来まる。
・システム関数(本体も)は呼び出し側のコードに測定コードが埋め込まれる(呼び出される側ではない)
・ユーザ関数は呼び出される側のコードに埋め込まれる。
・この命令自体による性能インパクトが激しいので、測定された値を扱いが難儀。回数のみならfunction(),try/finaly不要で軽いかも?
・結果を取り出す命令がない・・・というか、プログラム自身で自分の測定結果を命令で取り出すのは違う気がして未実装。
 本来は、IDE側の仕事 と思う。
 おそらく、プラットフォーム(nodejsとかブラウザ)の持つ機能に任せるのが1番(収集も表示も)と思うのですが、それにはきっと、本物の仕様に沿ったsourceMapが必要。

なお、chrome系以外では、マイクロ秒単位の高精度タイマが端末識別に利用できてしまう理由で精度がわざと落とされています(数ミリから数十ミリ秒単位のレベルまで)。そのため、よほど時間かかる処理ではいと測定できません(chrome系が仕様に従ってない)

命令を使わない限りは、ほぼ、影響ありません(if文の判定分、コンパイル時の負荷になる程度。実行時は全く影響なし)

以下のようなコードで測定する(結果の取り出しが現状ではちょっとトリッキーです)

「全て」をパフォーマンスモニタ適用
●テスト関数とは
 2^2を表示
ここまで
ここまで

テスト関数する

●self参照とは
 引数[0]で戻る
ここまで
●パフォーマンスモニタ結果表示とは
 SELFはself参照
 結果集は『(function (self) {return self.__performance_monitor;})』を[SELF]でJS関数実行
 結果集を反復
  結果は結果集[対象キー]
   「{対象キー}:({結果["min_usec"]の整数部分}:{結果["max_usec"]の整数部分}){(結果["totel_usec"])の整数部分}/{結果["called"]の整数部分}={(結果["totel_usec"]/結果["called"])の整数部分}」を表示
 ここまで
ここまで

パフォーマンスモニタ結果表示

@kujirahand
Copy link
Owner

確認しました。全体的に良いと思います!
細かいパフォーマンス測定ができるようになって便利ですね。

nako_genの関数生成がちょっと複雑になってしまったのと、
今後も、何か関数生成コードの直前と直後に何か差し込む可能性もありそうなので、
パフォーマンス測定の注入コード生成部分だけ、別関数にすると読みやすいさが担保されるかなと思ったくらいです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants