ブログ 2018/12/24 静的な typeof/sizeof JIT Intrinsicsで少し触れましたが、 .NET Core 2.1ではEnum.HasFlagに対する最適化が掛かります。 .NET Core 2.0と2.1でEnum.HasFlagの実行速度が1桁違うわけですが、 古いランタイムでも何とかする手段がなくもないです(ただし、Unsafe)。 今日はそんな、.NET Core 2.0以前でも使える最適化の話。 定数最適化 例えば、以下のようなコードを考えます。 static int X() { if (true… 続きを読む 2018/12/23 JIT Intrinsics .NET Core 2.1 では、いくつか、JIT 時の特殊対応によるパフォーマンス改善を行っています。 そういう「特殊対応」を intrinsic (固有の、内在的な、内因的な、本質的な)と呼びます。 「JIT 時の特殊対応」であれば「JIT intrinsic expansions」(固有展開)とか「JIT intrinsics」(s が付くことで名詞化してる。economics とかの s と同じ)と言います。 Intrinsic 属性 JIT 時特殊対応をしているクラスやメソッド… 続きを読む 2018/12/22 配列インデックスは0以上 今日は corefx (.NET の標準ライブラリ)の実装レベルの最適化の話。 .NET Core 2.0 とか 2.1 リリースの頃にブログも出ていましたが、 .NET Core 2.X 世代は結構パフォーマンス改善を頑張っています。 Performance Improvements in .NET Core Performance Improvements in .NET Core 2.1 実際、 .NET Framework で動かしていたアプリを、 .NET Core… 続きを読む 2018/12/21 ピックアップRoslyn 12/21 & Connect() Japan フォローアップ 昨日、Connect(); Japan 2018でちょっとだけですけども、C# 8.0の話をしたりしました。 7分(ちょっと超過したけど)だとあんまり大したことを話せず… とりあえず、昨日やったデモは、1機能1コミットでプルリクを作って GitHub においてあるのでそちらも参照してみてください。 C# 8.0 デモ用 … 昨日やれたデモ。Preview 1 で入った機能の紹介。 UfcppSample … C# によるプログラミング入門で書いてるコードに対して NullableRe… 続きを読む 2018/12/20 foreach の掛け方いろいろ IEnumerator の別実装で、 インターフェイス越しの foreach には仮想呼び出しのコストが結構掛かっているという話を書きました。 (そちらでの主題は「なので、MoveNext/Currentの2つに分かれているのはちょっともったいない」という話でした。 もちろん、それを気にしないといけないのは大体パフォーマンス最優先のエクストリームな状況だけです。) あと、配列のインデクサーでは、配列とSpan<T>構造体の列挙には C# のレベルでも JIT のレベルでも最適… 続きを読む 新しい投稿へ 過去の投稿へ
2018/12/24 静的な typeof/sizeof JIT Intrinsicsで少し触れましたが、 .NET Core 2.1ではEnum.HasFlagに対する最適化が掛かります。 .NET Core 2.0と2.1でEnum.HasFlagの実行速度が1桁違うわけですが、 古いランタイムでも何とかする手段がなくもないです(ただし、Unsafe)。 今日はそんな、.NET Core 2.0以前でも使える最適化の話。 定数最適化 例えば、以下のようなコードを考えます。 static int X() { if (true… 続きを読む
2018/12/23 JIT Intrinsics .NET Core 2.1 では、いくつか、JIT 時の特殊対応によるパフォーマンス改善を行っています。 そういう「特殊対応」を intrinsic (固有の、内在的な、内因的な、本質的な)と呼びます。 「JIT 時の特殊対応」であれば「JIT intrinsic expansions」(固有展開)とか「JIT intrinsics」(s が付くことで名詞化してる。economics とかの s と同じ)と言います。 Intrinsic 属性 JIT 時特殊対応をしているクラスやメソッド… 続きを読む
2018/12/22 配列インデックスは0以上 今日は corefx (.NET の標準ライブラリ)の実装レベルの最適化の話。 .NET Core 2.0 とか 2.1 リリースの頃にブログも出ていましたが、 .NET Core 2.X 世代は結構パフォーマンス改善を頑張っています。 Performance Improvements in .NET Core Performance Improvements in .NET Core 2.1 実際、 .NET Framework で動かしていたアプリを、 .NET Core… 続きを読む
2018/12/21 ピックアップRoslyn 12/21 & Connect() Japan フォローアップ 昨日、Connect(); Japan 2018でちょっとだけですけども、C# 8.0の話をしたりしました。 7分(ちょっと超過したけど)だとあんまり大したことを話せず… とりあえず、昨日やったデモは、1機能1コミットでプルリクを作って GitHub においてあるのでそちらも参照してみてください。 C# 8.0 デモ用 … 昨日やれたデモ。Preview 1 で入った機能の紹介。 UfcppSample … C# によるプログラミング入門で書いてるコードに対して NullableRe… 続きを読む
2018/12/20 foreach の掛け方いろいろ IEnumerator の別実装で、 インターフェイス越しの foreach には仮想呼び出しのコストが結構掛かっているという話を書きました。 (そちらでの主題は「なので、MoveNext/Currentの2つに分かれているのはちょっともったいない」という話でした。 もちろん、それを気にしないといけないのは大体パフォーマンス最優先のエクストリームな状況だけです。) あと、配列のインデクサーでは、配列とSpan<T>構造体の列挙には C# のレベルでも JIT のレベルでも最適… 続きを読む