ブログ 2018/12/30 段階コンパイル (Tiered Compilation) 今日は .NET Core 2.1 の頃に実装されて(有効にするには設定が必要)、 .NET Core 2.2 からは既定で有効になるランタイムの最適化の話。 (※ Preview の頃にいったん規定で有効になったものの、結局、リリースでは opt-in に戻した模様。後述する gen0 最適化問題とかがあるせいかも。) .NET Core 2.1 の頃に以下のようなブログが出ていました。 Tiered Compilation Preview in .NET Core 2.1 … 続きを読む 2018/12/29 仮想テーブルの中身をのぞき見 しばらくやってた Unsafe シリーズですが、今日は特に凶悪な奴です。 割かし最近なんですが、coreclr にこんなプルリクが出ていました。 Improve performance of Memory<T>.Span property getter これがまあ、なかなか凄いコードを含んでいます。仮想テーブルの中身を覗いて、「特定のビットが立っていたら配列」みたいなコードを書いています。 該当箇所 まず、仮想テーブルのポインターを取得 private sta… 続きを読む 2018/12/28 Unsafe クラス(保証のある利用例) 「Unsafe クラス(保証外)」ではわざわざ動作保証のない相当に邪悪なコードを紹介しました。 とはいえ、別に Unsafeクラスを使った瞬間に動作保証がなくなるわけではありません。 単に、開発者の裁量に任されるというだけで、正しく使えば問題は起こしません。 例えば、Unsafe.Asメソッドは型チェックをせずに型を強制変換するメソッドですが、 最初から(Asメソッドよりも前に予めチェックして)型がわかっているなら何も問題ありません。 Union 型 例として、「A または B のど… 続きを読む 2018/12/27 Unsafe クラス(保証外) 今日は Unsafe クラスがらみの話で、 特にきわどい(動作保証外)やつ。 .NET Core 2.0 ~ 2.1 くらいでは動くことを確認していますが、 仕様として保証がなく、古いランタイムや将来、また、Mono などの他の .NET 環境で動く保証がないものです。 メモリレイアウトが同じもの まず、元々 unsafe コードを使ってできるし、 Unsafeクラスを使っても動作保証があるものから説明。 ポインターを使ったり、Unsafe.Asメソッドを使うと、 全然違う型・C… 続きを読む 2018/12/26 将来のメモリ管理 今日はまたちょっと将来の話。 リリース時期・本当にリリースされるか未定の機能で、メモリ管理がらみの話をまとめて。 ヒープ確保の負担を減らしたい メモリの管理方法にはスタックとヒープがあって、 一般的にはスタックの方が高速です。 スタックの方が制限がきついので、遅くてもしょうがなくヒープを使う場面がでてきます。 ヒープ管理は結構大きな負担なので、これを減らせば結構なパフォーマンス改善になります。 いくつか方向性があって、以下のような最適化が考えられます。 ヒープ管理自体を賢… 続きを読む 新しい投稿へ 過去の投稿へ
2018/12/30 段階コンパイル (Tiered Compilation) 今日は .NET Core 2.1 の頃に実装されて(有効にするには設定が必要)、 .NET Core 2.2 からは既定で有効になるランタイムの最適化の話。 (※ Preview の頃にいったん規定で有効になったものの、結局、リリースでは opt-in に戻した模様。後述する gen0 最適化問題とかがあるせいかも。) .NET Core 2.1 の頃に以下のようなブログが出ていました。 Tiered Compilation Preview in .NET Core 2.1 … 続きを読む
2018/12/29 仮想テーブルの中身をのぞき見 しばらくやってた Unsafe シリーズですが、今日は特に凶悪な奴です。 割かし最近なんですが、coreclr にこんなプルリクが出ていました。 Improve performance of Memory<T>.Span property getter これがまあ、なかなか凄いコードを含んでいます。仮想テーブルの中身を覗いて、「特定のビットが立っていたら配列」みたいなコードを書いています。 該当箇所 まず、仮想テーブルのポインターを取得 private sta… 続きを読む
2018/12/28 Unsafe クラス(保証のある利用例) 「Unsafe クラス(保証外)」ではわざわざ動作保証のない相当に邪悪なコードを紹介しました。 とはいえ、別に Unsafeクラスを使った瞬間に動作保証がなくなるわけではありません。 単に、開発者の裁量に任されるというだけで、正しく使えば問題は起こしません。 例えば、Unsafe.Asメソッドは型チェックをせずに型を強制変換するメソッドですが、 最初から(Asメソッドよりも前に予めチェックして)型がわかっているなら何も問題ありません。 Union 型 例として、「A または B のど… 続きを読む
2018/12/27 Unsafe クラス(保証外) 今日は Unsafe クラスがらみの話で、 特にきわどい(動作保証外)やつ。 .NET Core 2.0 ~ 2.1 くらいでは動くことを確認していますが、 仕様として保証がなく、古いランタイムや将来、また、Mono などの他の .NET 環境で動く保証がないものです。 メモリレイアウトが同じもの まず、元々 unsafe コードを使ってできるし、 Unsafeクラスを使っても動作保証があるものから説明。 ポインターを使ったり、Unsafe.Asメソッドを使うと、 全然違う型・C… 続きを読む
2018/12/26 将来のメモリ管理 今日はまたちょっと将来の話。 リリース時期・本当にリリースされるか未定の機能で、メモリ管理がらみの話をまとめて。 ヒープ確保の負担を減らしたい メモリの管理方法にはスタックとヒープがあって、 一般的にはスタックの方が高速です。 スタックの方が制限がきついので、遅くてもしょうがなくヒープを使う場面がでてきます。 ヒープ管理は結構大きな負担なので、これを減らせば結構なパフォーマンス改善になります。 いくつか方向性があって、以下のような最適化が考えられます。 ヒープ管理自体を賢… 続きを読む