मैं .NET चार्ट नियंत्रण लाइब्रेरी का उपयोग कर रहा हूं जो पृष्ठभूमि थ्रेड पर डिस्क पर छवियों को बनाने और सहेजने के लिए .NET 4.0 बीटा 2 के साथ आता है। मैं स्क्रीन पर चार्ट नहीं दिखा रहा हूं, हालांकि, बस एक चार्ट बना रहा हूं, इसे डिस्क पर सहेज रहा हूं, और इसे नष्ट कर रहा हूं। कुछ ऐसा:.NET चार्ट नियंत्रण समांतर प्रदर्शन
public void GeneratePlot(IList<DataPoint> series, Stream outputStream) {
using (var ch = new Chart()) {
ch.ChartAreas.Add(new ChartArea());
var s = new Series();
foreach (var pnt in series) s.Points.Add(pnt);
ch.Series.Add(s);
ch.SaveImage(outputStream, ChartImageFormat.Png);
}
}
प्रत्येक चार्ट को बनाने और सहेजने में लगभग 300 - 400 एमएस लग रहा था। मेरे पास संभावित रूप से सैकड़ों चार्ट बनाने के लिए हैं, इसलिए मैंने सोचा कि मैं इन कार्यों को समानांतर करने के लिए Parallel.For()
का उपयोग करूंगा। मेरे पास 8 कोर मशीन है, हालांकि, जब मैं एक समय में 4 चार्ट बनाने की कोशिश करता हूं, तो मेरा चार्ट 800 से 1400 एमएस तक कहीं भी बढ़ता/बचाता है, जिनमें से लगभग Chart.SaveImage
तक उपभोग किया जाता है।
मैंने सोचा था कि मैं/हे, इसलिए परीक्षण करने के लिए है कि मैं करने के लिए अंतिम पंक्ति बदल इस डिस्क की एक सीमा हो सकती है:
ch.SaveImage(Stream.Null, ChartImageFormat.Png);
यहां तक कि एक अशक्त करने के लिए लिख स्ट्रीम प्रदर्शन ही के बारे में अब भी है (800 - 1400 एमएस)।
क्या मुझे इस पुस्तकालय के साथ समानांतर में पृष्ठभूमि धागे पर छवियां नहीं बनाना चाहिए, या क्या मैं कुछ गलत कर रहा हूं?
धन्यवाद
संपादित करें: जोड़ा गया पूरा कोड नमूना
सीधे शब्दों में झंडा CreateCharts()
के लिए पारित बनाम धारावाहिक समानांतर परीक्षण करने के लिए बदल जाते हैं।
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms.DataVisualization.Charting;
namespace ConsoleChartTest
{
class Program
{
public static void GeneratePlot(IEnumerable<DataPoint> series, Stream outputStream)
{
long beginTime = Environment.TickCount;
using (var ch = new Chart())
{
ch.ChartAreas.Add(new ChartArea());
var s = new Series();
foreach (var pnt in series)
s.Points.Add(pnt);
ch.Series.Add(s);
long endTime = Environment.TickCount;
long createTime = endTime - beginTime;
beginTime = Environment.TickCount;
ch.SaveImage(outputStream, ChartImageFormat.Png);
endTime = Environment.TickCount;
long saveTime = endTime - beginTime;
Console.WriteLine("Thread Id: {0,2} Create Time: {1,3} Save Time: {2,3}",
Thread.CurrentThread.ManagedThreadId, createTime, saveTime);
}
}
public static void CreateCharts(bool parallel)
{
var data = new DataPoint[20000];
for (int i = 0; i < data.Length; i++)
{
data[i] = new DataPoint(i, i);
}
if (parallel)
{
Parallel.For(0, 10, (i) => GeneratePlot(data, Stream.Null));
}
else
{
for (int i = 0; i < 10; i++)
GeneratePlot(data, Stream.Null);
}
}
static void Main(string[] args)
{
Console.WriteLine("Main Thread Id: {0,2}", Thread.CurrentThread.ManagedThreadId);
long beginTime = Environment.TickCount;
CreateCharts(false);
long endTime = Environment.TickCount;
Console.WriteLine("Total Time: {0}", endTime - beginTime);
}
}
}
हास्य हमें - आप सहित पूरा कोड पोस्ट कर सकते हैं, जहां आप 'Parallel.For' का उपयोग करें? और हमें यह भी बताएं कि आप इस कोड का उपयोग कैसे कर रहे हैं, जहां संख्याएं आ रही हैं? आपके बेंचमार्किंग के दौरान सीपीयू उपयोग कैसा दिखता है? – Aaronaught
शायद समस्या रूपांतरण में है, फिर भी आप और कोड पोस्ट कर सकते हैं? –