ブログ 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/24 書記素分割/Unicode カテゴリー判定 なんか、昔作ったGraphemeSplitterがC++方面のUnicodeがらみのブログから参照されてたので、ちょっと補足。 UNICODE TEXT SEGMENTATION 「書記素って何?」って話は詳しくは昔書いた記事でも見てもらうとして。 とりあえず、「人間が見て1文字と思うようなもの」を指して書記素(grapheme)といいます。複数の Unicode コードポイントが結合しまくるので、可変長。 いつも例に出すのが家族絵文字(👩🏻👦🏼👨🏽👦🏾👦🏿👩… 続きを読む 新しい投稿へ 過去の投稿へ
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/24 書記素分割/Unicode カテゴリー判定 なんか、昔作ったGraphemeSplitterがC++方面のUnicodeがらみのブログから参照されてたので、ちょっと補足。 UNICODE TEXT SEGMENTATION 「書記素って何?」って話は詳しくは昔書いた記事でも見てもらうとして。 とりあえず、「人間が見て1文字と思うようなもの」を指して書記素(grapheme)といいます。複数の Unicode コードポイントが結合しまくるので、可変長。 いつも例に出すのが家族絵文字(👩🏻👦🏼👨🏽👦🏾👦🏿👩… 続きを読む