SlideShare a Scribd company logo
5
Most read
7
Most read
12
Most read
LINQの速度測ってみた
2019年7月19日
© 2019 Core Concept Technologies Inc.
安宅彰一朗(アタケショウイチロウ)
所属:本社事業部
役職:シニアエンジニア
好きな食べ物:ハンバーガー
最近はSpringBootでJavaJavaしてます
自己紹介
1CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
ざっくり言うと集合をSQLっぽく扱える仕組みです。こんなの。
LINQとは
2CONFIDENTIAL
var ret = collection
.Where(x => x >= 500) // 条件で絞って
.Select(x => x * x) // 個別に処理して
.OrderBy(x => x); // ソートする
C#的にはIEnumerableインターフェイスを実装しているオブジェクトに
対してGenerics、拡張メソッドで実現されているライブラリです。
※ちなみにこの資料はなにか素晴らしい知見が得られるようなものではなく
思うがままLINQの速度を測ってみた、ただそれだけです!
© 2019 Core Concept Technologies Inc.
以下のようなインターフェイスです。
LINQはこれに対して処理処理を行うものです。
なのでLINQに対応した独自クラスなんかも簡単に作れちゃいます。
※今回は実装まではやりません。気になる人は実装してみてください。
IEnumerable(アイエニュメラブル)ってなんぞ?
3CONFIDENTIAL
class DemoList : IEnumerable
{
public IEnumerator GetEnumerator() { return new DemoListEnumerator(); }
class DemoListEnumerator : IEnumerator
{
public Object Current { get; } // 今いる場所
public bool MoveNext() { return true; } // 次へ移動(移動できればtrue)
public void Reset() { } // 今いる場所を最初に戻す
}
}
© 2019 Core Concept Technologies Inc.
ICollectionならプロパティあるんだから使えばいいじゃん的な
最適化が入ってますが、主要実装はこれだけ。とってもシンプル!
https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Count.cs
ちょっとCount覗いてみましょう
4CONFIDENTIAL
public static int Count<TSource>(this IEnumerable<TSource> source)
{
:
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
checked
{
while (e.MoveNext())
{
count++;
}
}
}
return count;
}
© 2019 Core Concept Technologies Inc.
準備
5CONFIDENTIAL
// 1~10000000ランダム数列1億件
List<int> listRandom = SpeedTestBase.CreateList(100000000);
// 1~1億の数列
IEnumerable<int> enumerableNum = Enumerable.Range(1, 100000000);
端末スペック
CPU:Core i5(4コア)
メモリ:16GB
© 2019 Core Concept Technologies Inc.
Count-List : 00:00:00.0005399
Count-IEnumerable : 00:00:00.2788430
ListとIEnumerableのCountは全然違う
6CONFIDENTIAL
sw.Restart();
var result_01_1 = listRandom.Count();
sw.Stop();
Console.WriteLine("Count-List : " + sw.Elapsed);
sw.Restart();
var result_01_2 = enumerableNum.Count();
sw.Stop();
Console.WriteLine("Count-IEnumerable : " + sw.Elapsed);
© 2019 Core Concept Technologies Inc.
Max-LINQ : 00:00:00.6924498
Max-foreach : 00:00:00.4709000
Max(最大値)
7CONFIDENTIAL
sw.Restart();
var result_02_1 = listRandom.Max();
sw.Stop();
Console.WriteLine("Max-LINQ : " + sw.Elapsed);
sw.Restart();
int max = 0;
foreach (int i in listRandom)
{
if(max < i) { max = i; }
}
sw.Stop();
Console.WriteLine("Max-foreach : " + sw.Elapsed);
© 2019 Core Concept Technologies Inc.
Where-LINQ-toList : 00:00:00.8328413
Where-LINQ-foreach : 00:00:00.7824337
Where-foreach : 00:00:00.6183393
Where(抽出)
8CONFIDENTIAL
sw.Restart();
var result_03_1 = listRandom.Where(x => x % 123 == 0).ToList();
sw.Stop();
Console.WriteLine("Where-LINQ-toList : " + sw.Elapsed);
sw.Restart();
var result_03_2 = listRandom.Where(x => x % 123 == 0);
foreach (var x in result_03_2) { }
sw.Stop();
Console.WriteLine("Where-LINQ-foreach : " + sw.Elapsed);
sw.Restart();
var result_03_3 = new List<int>();
foreach (var x in listRandom)
{
if (x % 123 == 0)
{
result_03_3.Add(x * x);
}
}
sw.Stop();
Console.WriteLine("Where-foreach : " + sw.Elapsed);
© 2019 Core Concept Technologies Inc.
Parallel LINQ (PLINQ) は、LINQ パターンの並列実装です。 PLINQ クエリは、あらゆ
る意味において、並列ではない LINQ to Objects クエリに似ています。 PLINQ クエリ
は、LINQ の順次クエリと同様、メモリ内の IEnumerable また
は IEnumerable<T> データ ソースで実行され、遅延実行が存在するので、クエリが列
挙されるまでは実行されません。 主な相違点は、PLINQ は、システムのすべてのプロ
セッサを十分に活用しようとする点です。 そのために、データ ソースをセグメントに
パーティション分割し、複数のプロセッサで個々のワーカー スレッドの各セグメントに
対してクエリを並行実行します。 多くの場合、並行実行によって、クエリは非常に高速
に処理されます。
https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/parallel-
linq-plinq
そういえばPLINQってあったやん
9CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
Parallel LINQ (PLINQ) は、LINQ パターンの並列実装です。 PLINQ クエリは、あらゆ
る意味において、並列ではない LINQ to Objects クエリに似ています。 PLINQ クエリ
は、LINQ の順次クエリと同様、メモリ内の IEnumerable また
は IEnumerable<T> データ ソースで実行され、遅延実行が存在するので、クエリが列
挙されるまでは実行されません。 主な相違点は、PLINQ は、システムのすべてのプロ
セッサを十分に活用しようとする点です。 そのために、データ ソースをセグメントに
パーティション分割し、複数のプロセッサで個々のワーカー スレッドの各セグメントに
対してクエリを並行実行します。 多くの場合、並行実行によって、クエリは非常に高速
に処理されます。
https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/parallel-
linq-plinq
そういえばPLINQってあったやん
10CONFIDENTIAL
まあ理屈はどうでもいいんですよ
測ってみましょう!
© 2019 Core Concept Technologies Inc.
PLINQ-Heavy-ForAll : 00:00:07.5491188
PLINQ-Heavy-foreach : 00:00:26.5182497
PLINQのForAllとforeach(重い処理)
11CONFIDENTIAL
sw.Restart();
var result_03_4 = listRandom.AsParallel().Where(x => x % 123 == 0);
result_03_4.ForAll(x => SpeedTestBase.HeavyProc(x));
sw.Stop();
Console.WriteLine("PLINQ-Heavy-ForAll : " + sw.Elapsed);
sw.Restart();
var result_03_5 = listRandom.AsParallel().Where(x => x % 123 == 0);
foreach(var x in result_03_5)
{
SpeedTestBase.HeavyProc(x);
}
sw.Stop();
Console.WriteLine("PLINQ-Heavy-foreach : " + sw.Elapsed);
因数分解してます
© 2019 Core Concept Technologies Inc.
Microsoftドキュメントちゃんとしてるから大好きです。
https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-
programming/introduction-to-plinq
なんでなんでしたっけ?
12CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
PLINQ-light-ForAll : 00:00:00.4169516
PLINQ-light-foreach : 00:00:00.3145349
PLINQのForAllとforeach(軽い処理)
13CONFIDENTIAL
sw.Restart();
var result_04_1 = listRandom.AsParallel().Where(x => x % 123 == 0);
result_04_1.ForAll(x => SpeedTestBase.lightProc(x));
sw.Stop();
Console.WriteLine("PLINQ-light-ForAll : " + sw.Elapsed);
sw.Restart();
var result_04_2 = listRandom.AsParallel().Where(x => x % 123 == 0);
foreach (var x in result_04_2)
{
SpeedTestBase.lightProc(x);
}
sw.Stop();
Console.WriteLine("PLINQ-light-foreach : " + sw.Elapsed);
1足してます
© 2019 Core Concept Technologies Inc.
学び
14CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
1.PowerPointにソースコード貼るのめちゃ大変
学び
15CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
1.PowerPointにソースコード貼るのめちゃ大変
2.確かにLINQはちょっと遅い、遅いけど、、、
* 読みやすい(生産性向上)
* 遅延評価(省メモリ、無限ループもいけちゃう)
* だいたい1億件ループとか業務でしないし
* 並列処理はLINQ関係なく難しい
学び
16CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
1.PowerPointにソースコード貼るのめちゃ大変
2.確かにLINQはちょっと遅い、遅いけど、、、
* 読みやすい(生産性向上)
* 遅延評価(省メモリ、無限ループもいけちゃう)
* だいたい1億件ループとか業務でしないし
* 並列処理はLINQ関係なく難しい
3.でも確かに良くない書き方はあって。。。
学び
17CONFIDENTIAL
© 2019 Core Concept Technologies Inc.
やりがち1
18CONFIDENTIAL
sw.Restart();
var result_11_1 = listRandom.Where(x => x % 123 == 0).Select(x => x * x);
if(result_11_1.Count() > 0) { }
sw.Stop();
Console.WriteLine("time-11-1 : " + sw.Elapsed);
sw.Restart();
var result_11_2 = listRandom.Where(x => x % 123 == 0).Select(x => x * x);
if (result_11_2.Any()) { }
sw.Stop();
Console.WriteLine("time-11-2 : " + sw.Elapsed);
存在チェックしたいだけなのにCountしちゃう
time-11-1 : 00:00:00.6972058
time-11-2 : 00:00:00.0001552
© 2019 Core Concept Technologies Inc.
やりがち2
19CONFIDENTIAL
全部処理する必要ないのにListで受けちゃう
sw.Restart();
var result_12_1 = listRandom.Where(x => x % 123 == 0).ToList();
double sum1 = 0;
foreach (var i in result_12_1)
{
// 合計が1億超えたら終了みたいな
sum1 += i;
if (sum1 > 10000000) { break; }
}
sw.Stop();
Console.WriteLine("time-12-1 : " + sw.Elapsed);
sw.Restart();
var result_12_2 = listRandom.Where(x => x % 123 == 0);
double sum2 = 0;
foreach (var i in result_12_2)
{
// 合計が1億超えたら終了みたいな
sum2 += i;
if (sum2 > 10000000) { break; }
}
sw.Stop();
Console.WriteLine("time-12-2 : " + sw.Elapsed);
time-12-1 : 00:00:00.6682446
time-12-2 : 00:00:00.0001236
© 2019 Core Concept Technologies Inc.
やりがち3
20CONFIDENTIAL
途中まで同じなのに遅延評価しちゃう
sw.Restart();
var result_13_11 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Count();
var result_13_12 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Max();
var result_13_13 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Min();
sw.Stop();
Console.WriteLine("time-13-1 : " + sw.Elapsed);
sw.Restart();
var temp = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).ToList();
var result_13_21 = temp.Count();
var result_13_22 = temp.Max();
var result_13_23 = temp.Min();
sw.Stop();
Console.WriteLine("time-13-2 : " + sw.Elapsed);
time-13-1 : 00:00:02.4088091
time-13-2 : 00:00:00.8282709
Linqの速度測ってみた

More Related Content

PPT
SQLチューニング勉強会資料
PDF
各種データベースの特徴とパフォーマンス比較
PPTX
C#で速度を極めるいろは
PDF
NETCONFとYANGの話
PDF
PHP 5.5ネーティブキャッシュの話
PDF
こわくない Git
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PPT
Cassandraのしくみ データの読み書き編
SQLチューニング勉強会資料
各種データベースの特徴とパフォーマンス比較
C#で速度を極めるいろは
NETCONFとYANGの話
PHP 5.5ネーティブキャッシュの話
こわくない Git
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
Cassandraのしくみ データの読み書き編

What's hot (20)

PDF
高負荷に耐えうるWeb application serverの作り方
PPTX
ゲームエンジニアのためのデータベース設計
PDF
強力なグラフィック機能を備えた組版処理システムTwightの開発
PPT
インフラエンジニアのためのcassandra入門
PPTX
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
PPTX
キャッシュコヒーレントに囚われない並列カウンタ達
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
SQLアンチパターン(インデックスショットガン)
PDF
KVM環境におけるネットワーク速度ベンチマーク
PDF
Yahoo! JAPANのOracle構成-2017年版
PPTX
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
PPTX
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
PDF
Open Match Deep Dive
PDF
明日使えないすごいビット演算
PPTX
本当は恐ろしい分散システムの話
PDF
ChatGPTは思ったほど賢くない
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
Goss入門
高負荷に耐えうるWeb application serverの作り方
ゲームエンジニアのためのデータベース設計
強力なグラフィック機能を備えた組版処理システムTwightの開発
インフラエンジニアのためのcassandra入門
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
キャッシュコヒーレントに囚われない並列カウンタ達
今日からできる!簡単 .NET 高速化 Tips
SQLアンチパターン(インデックスショットガン)
KVM環境におけるネットワーク速度ベンチマーク
Yahoo! JAPANのOracle構成-2017年版
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
なかったらINSERTしたいし、あるならロック取りたいやん?
Open Match Deep Dive
明日使えないすごいビット演算
本当は恐ろしい分散システムの話
ChatGPTは思ったほど賢くない
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Goss入門
Ad

Similar to Linqの速度測ってみた (20)

PDF
LINQソースでGO!
PPTX
C#を始めたばかりの人へのLINQ to Objects
PDF
An Internal of LINQ to Objects
PPTX
Linqことはじめ
PDF
Linq To Fun
PPTX
Visual Studio による開発環境・プログラミングの進化
PPTX
LINQ概要
PDF
LINQ in Unity
PPTX
LINQ の概要とかもろもろ
PPTX
超LINQ入門
PPTX
C# LINQ ~深く知って、使いまくろう~
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PPTX
C# 3.0 以降
PDF
Final LINQ Extensions
PDF
VS勉強会 .NET Framework 入門
PDF
MlnagoyaRx02
PDF
MlnagoyaRx
PPTX
20080201
PDF
Tottoruby 20130119
PPTX
An other world awaits you
LINQソースでGO!
C#を始めたばかりの人へのLINQ to Objects
An Internal of LINQ to Objects
Linqことはじめ
Linq To Fun
Visual Studio による開発環境・プログラミングの進化
LINQ概要
LINQ in Unity
LINQ の概要とかもろもろ
超LINQ入門
C# LINQ ~深く知って、使いまくろう~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 3.0 以降
Final LINQ Extensions
VS勉強会 .NET Framework 入門
MlnagoyaRx02
MlnagoyaRx
20080201
Tottoruby 20130119
An other world awaits you
Ad

More from Core Concept Technologies (20)

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

Linqの速度測ってみた

  • 2. © 2019 Core Concept Technologies Inc. 安宅彰一朗(アタケショウイチロウ) 所属:本社事業部 役職:シニアエンジニア 好きな食べ物:ハンバーガー 最近はSpringBootでJavaJavaしてます 自己紹介 1CONFIDENTIAL
  • 3. © 2019 Core Concept Technologies Inc. ざっくり言うと集合をSQLっぽく扱える仕組みです。こんなの。 LINQとは 2CONFIDENTIAL var ret = collection .Where(x => x >= 500) // 条件で絞って .Select(x => x * x) // 個別に処理して .OrderBy(x => x); // ソートする C#的にはIEnumerableインターフェイスを実装しているオブジェクトに 対してGenerics、拡張メソッドで実現されているライブラリです。 ※ちなみにこの資料はなにか素晴らしい知見が得られるようなものではなく 思うがままLINQの速度を測ってみた、ただそれだけです!
  • 4. © 2019 Core Concept Technologies Inc. 以下のようなインターフェイスです。 LINQはこれに対して処理処理を行うものです。 なのでLINQに対応した独自クラスなんかも簡単に作れちゃいます。 ※今回は実装まではやりません。気になる人は実装してみてください。 IEnumerable(アイエニュメラブル)ってなんぞ? 3CONFIDENTIAL class DemoList : IEnumerable { public IEnumerator GetEnumerator() { return new DemoListEnumerator(); } class DemoListEnumerator : IEnumerator { public Object Current { get; } // 今いる場所 public bool MoveNext() { return true; } // 次へ移動(移動できればtrue) public void Reset() { } // 今いる場所を最初に戻す } }
  • 5. © 2019 Core Concept Technologies Inc. ICollectionならプロパティあるんだから使えばいいじゃん的な 最適化が入ってますが、主要実装はこれだけ。とってもシンプル! https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Count.cs ちょっとCount覗いてみましょう 4CONFIDENTIAL public static int Count<TSource>(this IEnumerable<TSource> source) { : int count = 0; using (IEnumerator<TSource> e = source.GetEnumerator()) { checked { while (e.MoveNext()) { count++; } } } return count; }
  • 6. © 2019 Core Concept Technologies Inc. 準備 5CONFIDENTIAL // 1~10000000ランダム数列1億件 List<int> listRandom = SpeedTestBase.CreateList(100000000); // 1~1億の数列 IEnumerable<int> enumerableNum = Enumerable.Range(1, 100000000); 端末スペック CPU:Core i5(4コア) メモリ:16GB
  • 7. © 2019 Core Concept Technologies Inc. Count-List : 00:00:00.0005399 Count-IEnumerable : 00:00:00.2788430 ListとIEnumerableのCountは全然違う 6CONFIDENTIAL sw.Restart(); var result_01_1 = listRandom.Count(); sw.Stop(); Console.WriteLine("Count-List : " + sw.Elapsed); sw.Restart(); var result_01_2 = enumerableNum.Count(); sw.Stop(); Console.WriteLine("Count-IEnumerable : " + sw.Elapsed);
  • 8. © 2019 Core Concept Technologies Inc. Max-LINQ : 00:00:00.6924498 Max-foreach : 00:00:00.4709000 Max(最大値) 7CONFIDENTIAL sw.Restart(); var result_02_1 = listRandom.Max(); sw.Stop(); Console.WriteLine("Max-LINQ : " + sw.Elapsed); sw.Restart(); int max = 0; foreach (int i in listRandom) { if(max < i) { max = i; } } sw.Stop(); Console.WriteLine("Max-foreach : " + sw.Elapsed);
  • 9. © 2019 Core Concept Technologies Inc. Where-LINQ-toList : 00:00:00.8328413 Where-LINQ-foreach : 00:00:00.7824337 Where-foreach : 00:00:00.6183393 Where(抽出) 8CONFIDENTIAL sw.Restart(); var result_03_1 = listRandom.Where(x => x % 123 == 0).ToList(); sw.Stop(); Console.WriteLine("Where-LINQ-toList : " + sw.Elapsed); sw.Restart(); var result_03_2 = listRandom.Where(x => x % 123 == 0); foreach (var x in result_03_2) { } sw.Stop(); Console.WriteLine("Where-LINQ-foreach : " + sw.Elapsed); sw.Restart(); var result_03_3 = new List<int>(); foreach (var x in listRandom) { if (x % 123 == 0) { result_03_3.Add(x * x); } } sw.Stop(); Console.WriteLine("Where-foreach : " + sw.Elapsed);
  • 10. © 2019 Core Concept Technologies Inc. Parallel LINQ (PLINQ) は、LINQ パターンの並列実装です。 PLINQ クエリは、あらゆ る意味において、並列ではない LINQ to Objects クエリに似ています。 PLINQ クエリ は、LINQ の順次クエリと同様、メモリ内の IEnumerable また は IEnumerable<T> データ ソースで実行され、遅延実行が存在するので、クエリが列 挙されるまでは実行されません。 主な相違点は、PLINQ は、システムのすべてのプロ セッサを十分に活用しようとする点です。 そのために、データ ソースをセグメントに パーティション分割し、複数のプロセッサで個々のワーカー スレッドの各セグメントに 対してクエリを並行実行します。 多くの場合、並行実行によって、クエリは非常に高速 に処理されます。 https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/parallel- linq-plinq そういえばPLINQってあったやん 9CONFIDENTIAL
  • 11. © 2019 Core Concept Technologies Inc. Parallel LINQ (PLINQ) は、LINQ パターンの並列実装です。 PLINQ クエリは、あらゆ る意味において、並列ではない LINQ to Objects クエリに似ています。 PLINQ クエリ は、LINQ の順次クエリと同様、メモリ内の IEnumerable また は IEnumerable<T> データ ソースで実行され、遅延実行が存在するので、クエリが列 挙されるまでは実行されません。 主な相違点は、PLINQ は、システムのすべてのプロ セッサを十分に活用しようとする点です。 そのために、データ ソースをセグメントに パーティション分割し、複数のプロセッサで個々のワーカー スレッドの各セグメントに 対してクエリを並行実行します。 多くの場合、並行実行によって、クエリは非常に高速 に処理されます。 https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/parallel- linq-plinq そういえばPLINQってあったやん 10CONFIDENTIAL まあ理屈はどうでもいいんですよ 測ってみましょう!
  • 12. © 2019 Core Concept Technologies Inc. PLINQ-Heavy-ForAll : 00:00:07.5491188 PLINQ-Heavy-foreach : 00:00:26.5182497 PLINQのForAllとforeach(重い処理) 11CONFIDENTIAL sw.Restart(); var result_03_4 = listRandom.AsParallel().Where(x => x % 123 == 0); result_03_4.ForAll(x => SpeedTestBase.HeavyProc(x)); sw.Stop(); Console.WriteLine("PLINQ-Heavy-ForAll : " + sw.Elapsed); sw.Restart(); var result_03_5 = listRandom.AsParallel().Where(x => x % 123 == 0); foreach(var x in result_03_5) { SpeedTestBase.HeavyProc(x); } sw.Stop(); Console.WriteLine("PLINQ-Heavy-foreach : " + sw.Elapsed); 因数分解してます
  • 13. © 2019 Core Concept Technologies Inc. Microsoftドキュメントちゃんとしてるから大好きです。 https://docs.microsoft.com/ja-jp/dotnet/standard/parallel- programming/introduction-to-plinq なんでなんでしたっけ? 12CONFIDENTIAL
  • 14. © 2019 Core Concept Technologies Inc. PLINQ-light-ForAll : 00:00:00.4169516 PLINQ-light-foreach : 00:00:00.3145349 PLINQのForAllとforeach(軽い処理) 13CONFIDENTIAL sw.Restart(); var result_04_1 = listRandom.AsParallel().Where(x => x % 123 == 0); result_04_1.ForAll(x => SpeedTestBase.lightProc(x)); sw.Stop(); Console.WriteLine("PLINQ-light-ForAll : " + sw.Elapsed); sw.Restart(); var result_04_2 = listRandom.AsParallel().Where(x => x % 123 == 0); foreach (var x in result_04_2) { SpeedTestBase.lightProc(x); } sw.Stop(); Console.WriteLine("PLINQ-light-foreach : " + sw.Elapsed); 1足してます
  • 15. © 2019 Core Concept Technologies Inc. 学び 14CONFIDENTIAL
  • 16. © 2019 Core Concept Technologies Inc. 1.PowerPointにソースコード貼るのめちゃ大変 学び 15CONFIDENTIAL
  • 17. © 2019 Core Concept Technologies Inc. 1.PowerPointにソースコード貼るのめちゃ大変 2.確かにLINQはちょっと遅い、遅いけど、、、 * 読みやすい(生産性向上) * 遅延評価(省メモリ、無限ループもいけちゃう) * だいたい1億件ループとか業務でしないし * 並列処理はLINQ関係なく難しい 学び 16CONFIDENTIAL
  • 18. © 2019 Core Concept Technologies Inc. 1.PowerPointにソースコード貼るのめちゃ大変 2.確かにLINQはちょっと遅い、遅いけど、、、 * 読みやすい(生産性向上) * 遅延評価(省メモリ、無限ループもいけちゃう) * だいたい1億件ループとか業務でしないし * 並列処理はLINQ関係なく難しい 3.でも確かに良くない書き方はあって。。。 学び 17CONFIDENTIAL
  • 19. © 2019 Core Concept Technologies Inc. やりがち1 18CONFIDENTIAL sw.Restart(); var result_11_1 = listRandom.Where(x => x % 123 == 0).Select(x => x * x); if(result_11_1.Count() > 0) { } sw.Stop(); Console.WriteLine("time-11-1 : " + sw.Elapsed); sw.Restart(); var result_11_2 = listRandom.Where(x => x % 123 == 0).Select(x => x * x); if (result_11_2.Any()) { } sw.Stop(); Console.WriteLine("time-11-2 : " + sw.Elapsed); 存在チェックしたいだけなのにCountしちゃう time-11-1 : 00:00:00.6972058 time-11-2 : 00:00:00.0001552
  • 20. © 2019 Core Concept Technologies Inc. やりがち2 19CONFIDENTIAL 全部処理する必要ないのにListで受けちゃう sw.Restart(); var result_12_1 = listRandom.Where(x => x % 123 == 0).ToList(); double sum1 = 0; foreach (var i in result_12_1) { // 合計が1億超えたら終了みたいな sum1 += i; if (sum1 > 10000000) { break; } } sw.Stop(); Console.WriteLine("time-12-1 : " + sw.Elapsed); sw.Restart(); var result_12_2 = listRandom.Where(x => x % 123 == 0); double sum2 = 0; foreach (var i in result_12_2) { // 合計が1億超えたら終了みたいな sum2 += i; if (sum2 > 10000000) { break; } } sw.Stop(); Console.WriteLine("time-12-2 : " + sw.Elapsed); time-12-1 : 00:00:00.6682446 time-12-2 : 00:00:00.0001236
  • 21. © 2019 Core Concept Technologies Inc. やりがち3 20CONFIDENTIAL 途中まで同じなのに遅延評価しちゃう sw.Restart(); var result_13_11 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Count(); var result_13_12 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Max(); var result_13_13 = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).Min(); sw.Stop(); Console.WriteLine("time-13-1 : " + sw.Elapsed); sw.Restart(); var temp = listRandom.Where(x => x % 123 == 0).Where(x => x > 0).ToList(); var result_13_21 = temp.Count(); var result_13_22 = temp.Max(); var result_13_23 = temp.Min(); sw.Stop(); Console.WriteLine("time-13-2 : " + sw.Elapsed); time-13-1 : 00:00:02.4088091 time-13-2 : 00:00:00.8282709