SlideShare a Scribd company logo
1 of 22
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

What's hot

「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう増田 亨
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解したtorisoup
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しようUnityTechnologiesJapan002
 
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Platform - Japan
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現gree_tech
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけらAtsushi Nakamura
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 

What's hot (20)

「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Jenkins 再入門
Jenkins 再入門Jenkins 再入門
Jenkins 再入門
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
【Unite Tokyo 2019】Unity Test Runnerを活用して内部品質を向上しよう
 
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
 
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら「関心の分離」と「疎結合」   ソフトウェアアーキテクチャのひとかけら
「関心の分離」と「疎結合」 ソフトウェアアーキテクチャのひとかけら
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 

Similar to Linqの速度測ってみた

Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignRyuji TAKEHARA
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906akirahiguchi
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLShinichiAoyagi
 
Typesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive SystemTypesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive SystemTIS Inc.
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxssuser8b389c
 
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文CODE BLUE
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWINYoshifumi Kawai
 
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみたakira6592
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナーTakahiro Iwase
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
OSC2012-KANSAI@Kyoto JOSUG
OSC2012-KANSAI@Kyoto JOSUGOSC2012-KANSAI@Kyoto JOSUG
OSC2012-KANSAI@Kyoto JOSUGHideki Saito
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回Shigeharu Yamaoka
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸Takahiro Iwase
 
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介cloudconductor
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 

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

Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
LINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XMLLINQ 概要 + 結構便利な LINQ to XML
LINQ 概要 + 結構便利な LINQ to XML
 
Typesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive SystemTypesafe Reactive Platformで作るReactive System
Typesafe Reactive Platformで作るReactive System
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
 
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
 
How to Make Own Framework built on OWIN
How to Make Own Framework built on OWINHow to Make Own Framework built on OWIN
How to Make Own Framework built on OWIN
 
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
私たちはRESTCONFでネットワーク自動化的に何が嬉しくなるのか考えてみた
 
20120405 setsunaセミナー
20120405 setsunaセミナー20120405 setsunaセミナー
20120405 setsunaセミナー
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
 
Hbstudy41 auto scaling
Hbstudy41 auto scalingHbstudy41 auto scaling
Hbstudy41 auto scaling
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
OSC2012-KANSAI@Kyoto JOSUG
OSC2012-KANSAI@Kyoto JOSUGOSC2012-KANSAI@Kyoto JOSUG
OSC2012-KANSAI@Kyoto JOSUG
 
運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回運用構築技術者の為のPSプログラミング第1回
運用構築技術者の為のPSプログラミング第1回
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
 
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 

More from Core Concept Technologies

センシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったセンシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったCore Concept Technologies
 
コンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使うコンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使うCore Concept Technologies
 
開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話Core Concept Technologies
 
データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化データソースにLinqDataSourceを使った場合のGridViewの高速化
データソースにLinqDataSourceを使った場合のGridViewの高速化Core Concept Technologies
 
Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Pythonでディープラーニングをはじめるための一歩目
Pythonでディープラーニングをはじめるための一歩目Core Concept Technologies
 
Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Pythonで簡単な統計・分析をしてみよう!
Pythonで簡単な統計・分析をしてみよう!Core Concept Technologies
 
Google Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングGoogle Colab環境でPythonスクレイピング
Google Colab環境でPythonスクレイピングCore Concept Technologies
 
ロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことロボットと協働生活中に試行錯誤したこと
ロボットと協働生活中に試行錯誤したことCore Concept Technologies
 
なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。なぜIoTプロジェクトは途中でとまってしまうのか。
なぜIoTプロジェクトは途中でとまってしまうのか。Core Concept Technologies
 
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介します
工場に!オフィスに!明日、お安く、安全に導入できるセンサー紹介しますCore Concept Technologies
 
AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装AIによる簡単レコメンドシステム実装
AIによる簡単レコメンドシステム実装Core Concept Technologies
 
データを活用して何を実現してきたか?
データを活用して何を実現してきたか?データを活用して何を実現してきたか?
データを活用して何を実現してきたか?Core Concept Technologies
 

More from Core Concept Technologies (20)

センシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなったセンシングサイエンティストが経費精算を自動化したらこうなった
センシングサイエンティストが経費精算を自動化したらこうなった
 
コンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使うコンソールアプリケーションでDIを使う
コンソールアプリケーションでDIを使う
 
開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話開発環境をWindowsからMacに移行してみた話
開発環境をWindowsからMacに移行してみた話
 
データソースに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

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (9)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

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