Geiger10その4
2013年6月8日
さらに高速化。
描画データ抽出の時に、Int32.Parseしてるのを、DB取得時に別プロパティにキーを作成することにして、
さらに測定データと近似曲線で2回ループしていたのを1回のループの中で処理するようにした。
1 2 3 4 5 6 7 |
Parallel.For(0, DataCount, (counter) => { int i = counter; 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(); |
1 2 3 4 5 6 7 8 |
Parallel.For(0, DataCount, (counter) => { int i = counter; DateTime stepDateTime = firstDay.AddMinutes(i * minuteSpan); var dateDatas = drawDatas.Where(x => x.Day == stepDateTime.Day && x.Hour == stepDateTime.Hour && x.Minute == stepDateTime.Minute).FirstOrDefault(); |
DB取得は、
1.6250864秒→1.6746292秒
誤差範囲だろう。OK。
描画は、
件数 | 秒(前回) | 秒(Parse変更) | 秒(ループ変更) |
100 | 0.9948753 | 0.3750184 | 0.2500125 |
300 | 2.7342723 | 0.8594151 | 0.5312736 |
800 | 7.1038532 | 2.1251057 | 1.2890904 |
1000 | 2.8211885 | 1.5837518 | |
10000 | 25.8855324 | 15.1330634 |
おお、速くなった。!∑(゜∀゜)
Parseはコストかかるんだな。
そして、近似曲線のデータはKeyValuePairのListをLinqで抽出していたけど、KeyValuePairの検索は遅いらしいので、Dictionaryに変更してインデックスで拾うようにした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
List<DrawingPointF> drawPoints1 = new List<DrawingPointF>(); List<DrawingPointF> drawPoints2 = new List<DrawingPointF>(); Parallel.For(0, DataCount, (counter) => { int i = counter; DateTime stepDateTime = firstDay.AddMinutes(i * minuteSpan); var dateDatas = drawDatas.Where(x => x.Day == stepDateTime.Day && x.Hour == stepDateTime.Hour && x.Minute == stepDateTime.Minute).FirstOrDefault(); if (dateDatas != null) { drawPoints1.Add(new DrawingPointF(leftMarginX + intervalX * (float)(i), (sizeY - bottomMargin) - intervalY * dateDatas.Value)); drawPoints2.Add(new DrawingPointF(leftMarginX + intervalX * (float)(i), (sizeY - bottomMargin) - intervalY * drawPlofit[dateDatas.Key])); } }); drawPoints1.Sort(Compairer); drawPoints2.Sort(Compairer); pathSink1.BeginFigure(drawPoints1[0], FigureBegin.Hollow); pathSink2.BeginFigure(drawPoints2[0], FigureBegin.Hollow); for (int i = 1; i < drawPoints1.Count; i++) { pathSink1.AddLine(drawPoints1[i]); pathSink2.AddLine(drawPoints2[i]); darawDatasCount++; } pathSink1.EndFigure(FigureEnd.Open); pathSink1.Close(); pathSink2.EndFigure(FigureEnd.Open); pathSink2.Close(); |
結果、
件数 | 秒(前回) | 秒(Parse変更) | 秒(ループ変更) | 秒(Dictionary変更) |
100 | 0.9948753 | 0.3750184 | 0.2500125 | 0.2281533 |
300 | 2.7342723 | 0.8594151 | 0.5312736 | 0.4460666 |
800 | 7.1038532 | 2.1251057 | 1.2890904 | 1.1020225 |
1000 | 2.8211885 | 1.5837518 | 1.3493554 | |
10000 | 25.8855324 | 15.1330634 | 12.9416594 |
大量データだと結構違ってくるもんだな。
前回よりだいぶ、速くなった。
Parallelも効いてるんだろうな、いちおう4コアだし。
もうこれ以上速くならないかなぁ・・・
まぁ、ボチボチやろう・・・