いつの間にかと話題に。 去年の年末にちょこっと紹介したTryRoslynがJIT ASM (JITの結果がどういうネイティブコードになっているかを見れる)機能に対応してたみたいです。
TryRoslyn、今はSharpLabっていう名前に変わって、ドメインも取った見たいです:
ネイティブ コードの確認
例えばこんな感じのコードを書いて、
using static System.Math;
public class C
{
public double M(double x, double y) => Exp(x) * Sin(y);
}
SharpLabに貼り付けて、 ページ内の「Decompiled」のコンボボックスで「JIT Asm」を選ぶと、以下のような結果が出ます (現時点での結果)。
; This is an experimental implementation.
; Please report any bugs to https://github.com/ashmind/TryRoslyn/issues.
; Desktop CLR v4.6.1590.00 (clr.dll) on x86.
C..ctor()
L0000: ret
C.M(Double, Double)
L0000: fld qword [esp+0xc]
L0004: sub esp, 0x8
L0007: fstp qword [esp]
L000a: call System.Math.Exp(Double)
L000f: fld qword [esp+0x4]
L0013: fsin
L0015: fmulp st1, st0
L0017: ret 0x10
C#は、C# → IL にコンパイルする時点ではそこまで大きな最適化はしていなくて、 インライン展開とかの処理はIL → ネイティブコードに JIT コンパイルするタイミングで行っていたりします。 なので、本気で最適化に取り組みたかったらネイティブコードまで追わないと細かいところがわからなかったりします。
昔、Visual Studio上でネイティブコードまで追う方法とかも書きましたけど、 そこそこ面倒な手順だったりしますし。 さらっとオンラインで確認して見れるのは結構ありがたいかも。
中身
なんか流れを見るに、
- .NETチームが、主に自分たちの動作確認用に使う目的でJIT結果を見れるライブラリ(jitutils)を去年くらいから作ってる
- .NETチームの中の人がSharpLabの方に「これ使うとすげぇいいんじゃないか」みたいなissueを立てる
- 最近ついにCharpLabに組み込まれた
という感じみたい。
ということで、最終的には.NETチームが作っているツールに行きつくみたいです。