SlideShare a Scribd company logo
1 of 12
C#で速度を極める
いろは
(前編)
2019/7/19 みんなのC# (#2)
山本 礼貴
自己紹介
• コアコンセプトテクノロジー所属
• 山本 礼貴(やまもと れき)
• Twitter @proprogrammer0
• ブログ C#+WPFチューニング戦記(お休み中)
• C#ガチ勢
• 速いコード書きたい
C#と高速化へのモチベーション
• 基盤やライブラリもC#で書きたい
• 32bit/64bitもCPUの種類も気にしないでも良い
• 大抵保守性が高い
• 速いコードを書く人を支援してくれる仕組みがある
(.NET Framework 4.8 / .NET Core 2.1~ は顕著)
• 中身の事を知っていると、適切な書き方を容易に選べる
効果的に高速化したい
• 80:20の法則とかパレートの法則とか言うけど
「20%のコードが処理時間の80%を占める」
• だから頻度の高い20%のコードを高速化すると速くなる
• 基盤とかライブラリ
• プロファイルやベンチマークして、最適化すべきところを見つ
けよう(思い込みでやるのはダメ)
• ループ処理が大半なのでループのことを考えよう
~何を参考にしたらいいだろう~
LINQとループを
知る
ループそのものを高速化するヒントを得る
LINQの中身
• その合理的な実装を実際に読んでみる
• 正しく使うため
• 正しく応用するため(高速化のための重要なノウハウがある)
• MicrosoftのReferenceSourceやGitHubの.NET Coreのソースは
宝の山
• ジェネリックとラムダが使えるようになってからのものは特に素晴ら
しい
• 「いろは」なので着目点を勢いよく紹介!
LINQの中身
• Whereメソッドの中身
• T配列が最速、次はList<T>、次はIEnumerable<T>
という風に個別実装している
これのおかげで高速だったりメモリ効率が良かったり
配列より速い実装
が可能な場合、
Iterator<T>を実装
する余地もある
LINQの中身
• Select().Where() より Where().Select() の方が速い
• 計算から除外するものを最初に捨てるほうが速いのは道理
• だけどそれだけではない
• WhereSelectArrayIterator
WhereSelectListIterator
WhereSelectEnumerableIterator
• LinqでWhere().Select()と連続して書くとこれらのクラスが作られて、
1イテレーションで Where+Selectの処理をしてくれる
• イテレーターもコレクションの種類ごとにある
配列へのfor() vs foreach()
• 昔は明確に差がありforが高速と言われていた
• 今(.NET Framework 4.8/Core 2.1~)は誤差レベルの差しかない
• 配列の境界(OutOfRange)判定はJITが結構マメに省略してくれる
• foreach も境界判定が省略される
• Span<T>, ReadonlySpan<T> に対する foreach()もほぼ等速
• つまりindex を使いたいか/中身を書き換えるかで選択するのが
最良となった
• なおJITが特別扱いしているのは配列とSpan<T>だけ(重要)
配列とSpan<T>と境界判定
• 配列の一部に処理をする場合
• array[index]と書くと、その都度境界判定が入るので遅くなる
• 同メソッド内で明確に0~array.Lengthだと分かる場合は境界判定を省いてくれ
ることがある
• Span<T>は生成時1回しか境界判定しない
• それ以降は特別扱いしてくれるので境界判定がない
• var span = array.AsSpan(1, array.Length - 1);
• array.Skip(1)と同じものを列挙できるが速度はAsSpanが圧勝する
LINQとループを知る-まとめ
• LINQでもループでも、配列に対する処理をまずは速くしよう
• Where→Selectを続けて処理
• LINQの実装は高速化の際にとても参考になる
• Indexがほしいときだけfor、それ以外はforeach
• 配列の部分切り出しにはAsSpan
後編につづく…
ループの中身を高速化するにはどうしたらいいんだ…
GCフリーという高速化の魔窟へようこそ

More Related Content

What's hot

オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 

What's hot (20)

PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること40歳過ぎてもエンジニアでいるためにやっていること
40歳過ぎてもエンジニアでいるためにやっていること
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 

Similar to C#で速度を極めるいろは

LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
civic Sasaki
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
Yuto M
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
urasandesu
 

Similar to C#で速度を極めるいろは (20)

PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
 
パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45LT: 今日帰ってすぐに始められるPython #nds45
LT: 今日帰ってすぐに始められるPython #nds45
 
.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在
 
Pythonにおけるデバッガツールpdbについて
PythonにおけるデバッガツールpdbについてPythonにおけるデバッガツールpdbについて
Pythonにおけるデバッガツールpdbについて
 
初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptx初学者のためのプロンプトエンジニアリング実践.pptx
初学者のためのプロンプトエンジニアリング実践.pptx
 
.NET 6の期待の新機能とアップデート
.NET 6の期待の新機能とアップデート.NET 6の期待の新機能とアップデート
.NET 6の期待の新機能とアップデート
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
 
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugjPhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
 
自宅サーバーを立てる話
自宅サーバーを立てる話自宅サーバーを立てる話
自宅サーバーを立てる話
 
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
 
Craft CMSに最適なサーバはどんな環境?
Craft CMSに最適なサーバはどんな環境?Craft CMSに最適なサーバはどんな環境?
Craft CMSに最適なサーバはどんな環境?
 
俺とCiとinfrastructure as code(未完)
俺とCiとinfrastructure as code(未完)俺とCiとinfrastructure as code(未完)
俺とCiとinfrastructure as code(未完)
 
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
20190920 hannaripython20
20190920 hannaripython2020190920 hannaripython20
20190920 hannaripython20
 
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
元運用担当者が,現役時代に本当に欲しかったもの. Osc2014 kansai@kyoto terraform introduction
 

More from Core Concept Technologies

More from Core Concept Technologies (20)

センシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったセンシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなった
 
コンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使うコンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使う
 
開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話
 
Linqの速度測ってみた
Linqの速度測ってみたLinqの速度測ってみた
Linqの速度測ってみた
 
データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化
 
ロボットアームをPythonで動かす
ロボットアームをPythonで動かすロボットアームをPythonで動かす
ロボットアームをPythonで動かす
 
Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目
 
Pythonで簡単動画解析
Pythonで簡単動画解析Pythonで簡単動画解析
Pythonで簡単動画解析
 
Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!
 
Google Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングGoogle Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピング
 
可視化の先にあるものとは
可視化の先にあるものとは可視化の先にあるものとは
可視化の先にあるものとは
 
ロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したこと
 
3Dモデル類似検索
3Dモデル類似検索3Dモデル類似検索
3Dモデル類似検索
 
GPUいらずの高速動画異常検知
GPUいらずの高速動画異常検知GPUいらずの高速動画異常検知
GPUいらずの高速動画異常検知
 
固有表現抽出と適用例のご紹介
固有表現抽出と適用例のご紹介固有表現抽出と適用例のご紹介
固有表現抽出と適用例のご紹介
 
深層強化学習入門
深層強化学習入門深層強化学習入門
深層強化学習入門
 
なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。
 
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
 
AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装
 
Orizuru IoTは何を変えたのか
Orizuru IoTは何を変えたのかOrizuru IoTは何を変えたのか
Orizuru IoTは何を変えたのか
 

Recently uploaded

Recently uploaded (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

C#で速度を極めるいろは