ブログ 2018/12/20 foreach の掛け方いろいろ IEnumerator の別実装で、 インターフェイス越しの foreach には仮想呼び出しのコストが結構掛かっているという話を書きました。 (そちらでの主題は「なので、MoveNext/Currentの2つに分かれているのはちょっともったいない」という話でした。 もちろん、それを気にしないといけないのは大体パフォーマンス最優先のエクストリームな状況だけです。) あと、配列のインデクサーでは、配列とSpan<T>構造体の列挙には C# のレベルでも JIT のレベルでも最適… 続きを読む 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/20 foreach の掛け方いろいろ IEnumerator の別実装で、 インターフェイス越しの foreach には仮想呼び出しのコストが結構掛かっているという話を書きました。 (そちらでの主題は「なので、MoveNext/Currentの2つに分かれているのはちょっともったいない」という話でした。 もちろん、それを気にしないといけないのは大体パフォーマンス最優先のエクストリームな状況だけです。) あと、配列のインデクサーでは、配列とSpan<T>構造体の列挙には C# のレベルでも JIT のレベルでも最適… 続きを読む
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,… 続きを読む