ブログ 2018/12/19 IEnumerator の別実装 Devirtualization 最適化の話で仮想呼び出しのコストの話もしました。 そこでもう1つ思い出してほしいのが、C# 8.0 Async streamsで書いた、 IAsyncEnumerator<T>インターフェイスの話。 最終的な決定としては以下のような API を持っています。 public interface IAsyncEnumerator<out T> { T Current { get; } ValueTask<boo… 続きを読む 2018/12/18 Guarded Devirtualization 今日はちょっと将来の話。 提案ドキュメントとか予備実験的な実装はあるんですが、 リリースされる時期については未定のものです。 Guarded Devirtualization という最適化手法。 参考: JIT: see if guarded devirtualization for EqualityComparer methods pays off (余談ですが、この提案に当たっての調査レポート、ものすごく丁寧で良い内容です。 何かを提案する際の理想形。) Devirtu… 続きを読む 2018/12/17 Devirtualization (脱仮想化) 今日は一般論として「仮想メソッドは避けれるなら避けたい」という話と、 .NET Core 2.1 で仮想メソッドの「devirtualization」(脱仮想化)のための最適化が入っているという話。 仮想メソッドのコスト 多くのプログラミング言語で、 いわゆる多態的な動作の実現のために、 仮想呼び出し(virtual call)という機能が提供されています。 仮想呼び出しは、仮想関数テーブルを使った実装が一般的です。 テーブルを使った実装には以下のような利点があります。 後か… 続きを読む 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/19 IEnumerator の別実装 Devirtualization 最適化の話で仮想呼び出しのコストの話もしました。 そこでもう1つ思い出してほしいのが、C# 8.0 Async streamsで書いた、 IAsyncEnumerator<T>インターフェイスの話。 最終的な決定としては以下のような API を持っています。 public interface IAsyncEnumerator<out T> { T Current { get; } ValueTask<boo… 続きを読む
2018/12/18 Guarded Devirtualization 今日はちょっと将来の話。 提案ドキュメントとか予備実験的な実装はあるんですが、 リリースされる時期については未定のものです。 Guarded Devirtualization という最適化手法。 参考: JIT: see if guarded devirtualization for EqualityComparer methods pays off (余談ですが、この提案に当たっての調査レポート、ものすごく丁寧で良い内容です。 何かを提案する際の理想形。) Devirtu… 続きを読む
2018/12/17 Devirtualization (脱仮想化) 今日は一般論として「仮想メソッドは避けれるなら避けたい」という話と、 .NET Core 2.1 で仮想メソッドの「devirtualization」(脱仮想化)のための最適化が入っているという話。 仮想メソッドのコスト 多くのプログラミング言語で、 いわゆる多態的な動作の実現のために、 仮想呼び出し(virtual call)という機能が提供されています。 仮想呼び出しは、仮想関数テーブルを使った実装が一般的です。 テーブルを使った実装には以下のような利点があります。 後か… 続きを読む
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# の… 続きを読む