ブログ 2018/12/16 静的なデータの ReadOnlySpan 最適化 今日は C# コンパイラーのレベルの最適化(割と最近の追加)。 静的な byte データ列をプログラム中で使いたいとき、どう書くのが効率良いかといいかという話になります。 静的な byte データ 例えば、以下のようなコードを考えます。 using System; public class Program { static void Main() { var data = new byte[] { 65, 66, 67, 68, 69, 70, 71,… 続きを読む 2018/12/15 配列のダウンキャスト 今日は Unsafe クラスを使った配列の最適化の話。 object[] .NET Framework 1.x 時代からある古い API の中にはいくつか、 本当は T 型の配列なのに object[] で戻り値を返してくるようなメソッドがいくつかあります。 object[]とまでは言わないものの、基底クラスの配列で返すメソッドは多いです。 1.x 時代にはジェネリクスがなかったせいなんですが、今となっては不便ではあります。 例: マルチキャスト デリゲート 例を1個。 C# の… 続きを読む 2018/12/14 System.Runtime.CompilerServices.Unsafe 昨日から始まった在庫一掃処分セール的なブログなんですが、結構な頻度で「Unsafe クラス」ってのが出てきます。 以下のパッケージに含まれているもので、こいつをを参照すれば、通常の C# では書けないようなどぎつい unsafe な真似がし放題になります。 System.Runtime.CompilerServices.Unsafe これの登場はもう結構前なんですけども、そういえばちゃんとした説明をしたことなかったなと。 .NET の IL は意外とやりたい放題 上記パッケージ… 続きを読む 2018/12/13 配列のインデクサー C# 8.0 がらみの話も一段落してしまったので、 今日からしばらく予告通り、Gist に書き捨ててたもののブログ化になります。 ぶっちゃけ、在庫一掃処分セールみたいなものなので過度な期待はしないでください。 今日は C# コンパイラーと JIT レベルの最適化の話。 配列の範囲チェック .NET の配列は、バッファオーバーランとかのメモリ破壊を避けるべく、範囲チェックがかかっています。 using System; class Program { static v… 続きを読む 2018/12/12 C# 8.0 その他 (Preview 1での未実装機能) これまで紹介してきたもの以外にも、C# 8.0での導入が予定されている機能はいくつかあります。 ただ、Visual Studio 2019 Preview 1でまだ実装されていない機能・ちゃんと動いていない機能はまとめて軽く紹介して終わりにしようかと思います。 次以降のPreviewで実装されたらまた改めて紹介します。 インターフェイスのデフォルト実装 インターフェイス中のメソッドに実装を持てるようになります。 これに関しては昔書いた記事があるのでそちらを参照: 「インターフェー… 続きを読む 新しい投稿へ 過去の投稿へ
2018/12/16 静的なデータの ReadOnlySpan 最適化 今日は C# コンパイラーのレベルの最適化(割と最近の追加)。 静的な byte データ列をプログラム中で使いたいとき、どう書くのが効率良いかといいかという話になります。 静的な byte データ 例えば、以下のようなコードを考えます。 using System; public class Program { static void Main() { var data = new byte[] { 65, 66, 67, 68, 69, 70, 71,… 続きを読む
2018/12/15 配列のダウンキャスト 今日は Unsafe クラスを使った配列の最適化の話。 object[] .NET Framework 1.x 時代からある古い API の中にはいくつか、 本当は T 型の配列なのに object[] で戻り値を返してくるようなメソッドがいくつかあります。 object[]とまでは言わないものの、基底クラスの配列で返すメソッドは多いです。 1.x 時代にはジェネリクスがなかったせいなんですが、今となっては不便ではあります。 例: マルチキャスト デリゲート 例を1個。 C# の… 続きを読む
2018/12/14 System.Runtime.CompilerServices.Unsafe 昨日から始まった在庫一掃処分セール的なブログなんですが、結構な頻度で「Unsafe クラス」ってのが出てきます。 以下のパッケージに含まれているもので、こいつをを参照すれば、通常の C# では書けないようなどぎつい unsafe な真似がし放題になります。 System.Runtime.CompilerServices.Unsafe これの登場はもう結構前なんですけども、そういえばちゃんとした説明をしたことなかったなと。 .NET の IL は意外とやりたい放題 上記パッケージ… 続きを読む
2018/12/13 配列のインデクサー C# 8.0 がらみの話も一段落してしまったので、 今日からしばらく予告通り、Gist に書き捨ててたもののブログ化になります。 ぶっちゃけ、在庫一掃処分セールみたいなものなので過度な期待はしないでください。 今日は C# コンパイラーと JIT レベルの最適化の話。 配列の範囲チェック .NET の配列は、バッファオーバーランとかのメモリ破壊を避けるべく、範囲チェックがかかっています。 using System; class Program { static v… 続きを読む
2018/12/12 C# 8.0 その他 (Preview 1での未実装機能) これまで紹介してきたもの以外にも、C# 8.0での導入が予定されている機能はいくつかあります。 ただ、Visual Studio 2019 Preview 1でまだ実装されていない機能・ちゃんと動いていない機能はまとめて軽く紹介して終わりにしようかと思います。 次以降のPreviewで実装されたらまた改めて紹介します。 インターフェイスのデフォルト実装 インターフェイス中のメソッドに実装を持てるようになります。 これに関しては昔書いた記事があるのでそちらを参照: 「インターフェー… 続きを読む