Ruby 3.0の公式オープン投稿を読むと、一発特に私の仲間を捕まえました。 Ruby 3.0 では、IRB は
対策 の描写を提示しました。 デバッグ、コードの評価、または元のコードの作成時に合計でスニペットを実行する人として、私は興味をそそられました! IRB のオリジナルの
measure 描写は、IRB コンソールからさまざまなスニペットを測定するための一時的で直接的な方法です。
トグル小節として
オープンノート
が示したように、
measure
(またはを使用してメジャーをオンに切り替えることができますmeasure :on)、
measure :offの活用でoff
(有名な)> 測定 時間 は追加
irb=>なし irb
>スリープ 1
処理中
時間: 1.000649
s=> 1
irb> 1 処理中 時間: 0.000025s
=>1 irb
>メジャー :オフ=>
無し
デフォルトでは、上記でわかるように、IRB コンソールは処理時間を秒単位で出力します (
time の測定値)。測定がオンになっている場合のすべての命令。 Stackprof
開いたメモを読んでいたところ、
TIMEのメッセージが追加されましたこれは、この元の描写でコードを測定できるさまざまな方法があることを意味するためです! メジャーには 1 つの追加のデフォルト モードが付属していることがわかりました: Stackprof.
Stackprof (rapid for Stack Profiler) は、Ruby コード用のサンプリング コール スタック プロファイラーです。 この種のコードは、スタック内の実行が行われている場所でコードが実行されている間に多くのサンプルを奪う可能性があり、呼び出しスタックのすべてのステップでどれだけの時間を費やしているかを見積もる状況になる可能性があります。
measure :stackprof
.Stackprof 機能のデモンストレーションを行う前に、実際に何が起こっているのかを知るために、整数を出力するよりも多くのことを行うコード スニペットが必要になります。 理想的には、約 1 回 (または数千回) 促すことになります。 もう 2020 年ではないという証明された現実 (そして、Ruby 3 では無限のマナー定義が提示された) を祝いましょう。
def
スニペット()=
10_000.回
{日にち。パース(日にち
.現在時刻 .to_s ).12ヶ月 !=2020
}
)これで、Stackprof を使用してスニペットを作成し、次の出力について学習できます:
irb>
対策
:stackprof
) STACKPROF は追加 . => なし irb>
スニペット =================================モード
: CPU
(
1000) サンプル: 26
(
0.00
% 逃す レート ) GC :
2 (7.69%)==================================TOTAL
(
pct) サンプル (pct
)
フレーム 11 (42.3%) 11 ( 42.3 )%) 正規表現
#マッチ 5 (19.2
%) 5 (19.2
%
) 弦
#gsub!
4 (
15.4
% ) 4
(
15.4%
(19.2
) 整数#div
2 (7.7 %) 2 (7.7%) MatchData#open up 2
) (7.7%
) 2 (7.7%)(
スイープ) 1 (3.8
%
) 1 (3.8%) 日にち。 現在時刻
%) 2 (7.7%) MatchData#open up 2
) (7.7%
) 2 (7.7%)(
スイープ) 1 (3.8
%
) 1 (3.8%) 日にち。 現在時刻
に 1
(
3.8%) 1 (3.8%
)
日付#to_s 24 (92.3%) 0 (0.0%)
IRB
:: WorkSpace
#評価 24 ( 92.3
%)
0
(0.0%) IRB:: Irb #eval_input 24
(
92.3%
) 0 (
0.0
%) IRB .init_config
24
(92.3%) 0 (0.0%
)StackProf。衝動
24(92.3%) 0
(0.0%
)
IRB::
Irb#signal_status24 (92.3%
)0 (
0.0
%) RubyLex
#each_top_level_statement 24
(92.3%) 0 (0.0%
)カーネル#ループ 24 (92.3%
)0 (0.0%)
カーネル#spend 24 (92.3%) 0 ( 0.0 )%) IRB :: Irb
#衝動 24
(92.3
%) 0
(0.0%) IRB.開ける 24 ( 92.3 )%) 0
(0.0%
) <トップ
(必要)> 24 (
92.3%) 0 (0.0%) カーネル#ロード
24(
92.3%) 0
(0.0%
)<メイン
>24 (
92.3%)
0(0.0%
)
24 ( 92.3%)0(0.0
%) カーネル
#eval24 (92.3%) 0 (0.0
% )) <メイン
>
2 (7.7%)
0
(0.0
%) (
ごみ 品揃え) 24 (92.3%) 0 (0.0%)
整数#回
24
(92.3%
)0
(
物体0.0%
)#snippet22 (84.6%
)0 (
0.0
%) 日にち.パース 24
(92.3%
)
0 (
0.0ハザ! カスタマイズされたコードをまったく使用せずに、IRB コンソールから Stackprof 関係を取得しています!
出力をさらに表示するために、サンプルの数を確認しています。すべてのスタック本体で取得された時間と、それが占める時間の割合。 例として、最初の例は、
Regexp#match
本体で 11 個のサンプルが取得されたことを示しています。 ヒントのヘッダーは、合計 26 個のサンプルが取得されたことを示しています。 したがって、Stackprof はここで、時間の 11/26、つまり 42.3% が
Regexp#match
に費やされていると推定しています。 この 42.3% は、
(pct) 列内で表されます。 このモデルでは、Stackprof の出力から、さまざまなスタック フレームがコードの実行にどれだけの時間を費やしているかについて正確な推定値が得られます
さらにヘッダー内で、ここで
cpu モードでプロファイリングしていることを知る必要があります。 この種類の Stackprof は、CPU 命令が存在する可能性がある場合に、ミリ秒ごとにサンプルを取得します。 しかし、Stackprof には 多くの追加のサンプリング モード
があります。 招待状の 1 つはウォール サンプリングです。これは実際の時間のミリ秒ごとにサンプルを取得します。cpu 命令が存在する可能性があるか、またはもはや存在しない場合、トピックはありません。
built-in
measure :stackprof 本当のことを言うと、引数を渡すことができます。これは、Stackprof を要求するモードです。 例として、壁の時間のサンプリングを行うために、次のように促すことができます:
irb > 対策 :stackprof、 :壁 STACKPROF ) は 追加した。
=> nil irb> スニペット
==================================モード
:
壁(
1000) サンプル
:56 (
0.00% 逃す レート
)GC:
5
(8.93 %
)==================================合計 (
pct) サンプル
(pct)
フレーム 20 (35.7%) 20 (35.7% )) 正規表現#マッチ 10 (
17.9 %) 10
(17.9%
)日にち。現在時刻 ... )...=> 10000
私たちは、それぞれの
時間
と stackprof の測定値は、それぞれを切り替えるだけで簡単に取得できます。 さらに、
measure :time を利用することで、測定値を明示的に時間に関連付けることができるという言葉。 それらはエクスポーズ内に印刷され、追加されます:
irb
> 対策 :時間 TIME は
追加した.=>nilirb> 測定 :stackprof STACKPROF は 追加した
.処理時間: 0.000165 s
=> nil irb> スニペット
処理中
時間:
0.058907
s================================== モード: CPU(1000) サンプル: 35 (0.00% 逃す レート) GC
: 5 (
14.29%)==================================TOTAL
(pct)
サンプル(pct
)FRAME7
(20.0%) 7 (
20.0 %) 正規表現 #マッチ 6 (
17.1
%)
6(17.1%) 日にち
.現在時刻 ... ...
=>10000
)現在どの測定を行っているかを知るには、
測定:チェックリスト
を使用できます。measure :checklist:
> 測定 :チェックリスト - 時間 - STACKPROF 処理中 時間: 0.000129s
irb
==================================モード
: CPU
(1000) サンプル
:
0
(
NaN% 逃す レート
) GC:0 (なーん % )==================================合計 (pct) サンプル
(pct)
フレーム => nil
カスタム対策手順
じっと考えていると、「これでクリアだけど、把握メジャーマップが必要になったらどうしよう」と思うかもしれません。 また、「なんてストレスのないブログ投稿だ!」と考えているあなたも
どちらにしても、始めてよかったです! このブログ投稿の