ブログ 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/25 Span<T> 利用による最適化 このブログではたびたび「.NET Core 2.1 上で動かすだけで、アプリ側には何も手を加えなくても 2.0 の頃より1・2割高速になる」みたいな話をしています。 今月に入ってからは、DevirtualizationみたいなJIT時の最適化手法や、 逆にもっと小手先の細かな最適化の話も書いてきました。 .NET Core 2.1 ではこういういろいろな最適化が入っているんですが、 その中でも一番パフォーマンス改善に効いていそうなのがSpan<T>構造体の導入です。 Spa… 続きを読む 新しい投稿へ 過去の投稿へ
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/25 Span<T> 利用による最適化 このブログではたびたび「.NET Core 2.1 上で動かすだけで、アプリ側には何も手を加えなくても 2.0 の頃より1・2割高速になる」みたいな話をしています。 今月に入ってからは、DevirtualizationみたいなJIT時の最適化手法や、 逆にもっと小手先の細かな最適化の話も書いてきました。 .NET Core 2.1 ではこういういろいろな最適化が入っているんですが、 その中でも一番パフォーマンス改善に効いていそうなのがSpan<T>構造体の導入です。 Spa… 続きを読む