Geiger10その3
2013年6月7日
ちょっと高速化。
Parallel.ForとParallel.Invokeでやってみた。
DBデータ取得してコレクションに入れるまで、
1.6250864秒
描画完了まで、
件数 | 秒 |
100 | 3.6095689 |
300 | 10.6411940 |
800 | 28.4087785 |
コレクションから分毎のデータ抽出に時間がかかってると思われるので、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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()を入れてみると、
1 2 3 |
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で、
1 |
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秒とか普通に遅いよな・・・