ブログ 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/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/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/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… 続きを読む