ちょっと高速化。
Parallel.ForとParallel.Invokeでやってみた。
DBデータ取得してコレクションに入れるまで、
1.6250864秒
描画完了まで、
件数 |
秒 |
100 |
3.6095689 |
300 |
10.6411940 |
800 |
28.4087785 |
コレクションから分毎のデータ抽出に時間がかかってると思われるので、
|
for (int i = 0; i < DataCount; i++) { DateTime stepDateTime = firstDay.AddMinutes(i * minuteSpan); var dateDatas = drawDatas.Where(x => Int32.Parse(x.Key.Substring(8, 2)) == stepDateTime.Day && Int32.Parse(x.Key.Substring(11, 2)) == stepDateTime.Hour && Int32.Parse(x.Key.Substring(14, 2)) == stepDateTime.Minute).FirstOrDefault(); if (dateDatas.Key != null) { if (darawDatasCount == 0) pathSink.BeginFigure(new DrawingPointF(leftMarginX + intervalX * (float)(i), (sizeY - bottomMargin) - intervalY * dateDatas.Value), FigureBegin.Hollow); DrawingPointF pointData = new DrawingPointF(leftMarginX + intervalX * (float)(i), (sizeY - bottomMargin) - intervalY * dateDatas.Value); pathSink.AddLine(pointData); darawDatasCount++; } |
↑のメソッド構文に、AsParallel()を入れてみると、
|
var dateDatas = drawDatas.AsParallel().Where(x => Int32.Parse(x.Key.Substring(8, 2)) == stepDateTime.Day && Int32.Parse(x.Key.Substring(11, 2)) == stepDateTime.Hour && Int32.Parse(x.Key.Substring(14, 2)) == stepDateTime.Minute).FirstOrDefault(); |
件数 |
秒 |
100 |
1.8834992 |
300 |
5.5630926 |
800 |
13.1885343 |
速くなった。
Parallel効くなぁ。ってことで、for文自体にParallel.Forで、
|
Parallel.For(0, DataCount, (i) => |
とかすると、AddLine()で線を描画してるので、順番が狂ってしまう。。

分毎の描画データをParallelで作った後、ソートしてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
List<DrawingPointF> drawPoints = new List<DrawingPointF>(); Parallel.For(0, DataCount, (i) => { DateTime stepDateTime = firstDay.AddMinutes(i * minuteSpan); var dateDatas = drawDatas.Where(x => Int32.Parse(x.Key.Substring(8, 2)) == stepDateTime.Day && Int32.Parse(x.Key.Substring(11, 2)) == stepDateTime.Hour && Int32.Parse(x.Key.Substring(14, 2)) == stepDateTime.Minute).FirstOrDefault(); if (dateDatas.Key != null) { drawPoints.Add( new DrawingPointF(leftMarginX + intervalX * (float)(i), (sizeY - bottomMargin) - intervalY * dateDatas.Value)); } }); drawPoints.Sort(Compairer); for (int i = 0; i < drawPoints.Count; i++) { if (darawDatasCount == 0) pathSink.BeginFigure(drawPoints[i], FigureBegin.Hollow); pathSink.AddLine(drawPoints[i]); darawDatasCount++; } |
結果、
件数 |
秒 |
100 |
0.9948753 |
300 |
2.7342723 |
800 |
7.1038532 |
けっこう速くなったが、7秒とか普通に遅いよな・・・