我們在開發C#程序的時候,有時候遇到一些非常多的數據需要處理,尤其是我們要對一個集合中的數據做相同操作,這個集合中又包含了多個數據,我們一般使用for循環對集合中的每個數據分別處理,這樣處理起來可能需要花費很多的時間,那么有沒有能夠優化這個處理時間的方法呢,本文就來幫助大家解決這個問題!
1、傳統foreach循環處理
下面的代碼中使用Initialtest方法首先從本地讀取一個文件名叫 "蘋果.jpeg"的圖像,然后使用gdi技術復制這個圖像200遍,然后把這200個圖像存到ImageParamList 這個集合中,然后我們把這200個圖像保存到本地電腦中,由于圖像數據比較多,所以保存起來的速度比較慢,比如我這里定義了一個SavaImage方法,該方法使用foreach循環將ImageParamList 集合中200個圖像分別保存,在我的電腦上使用了差不多20秒,
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Initialtest();
}
private void Initialtest()
{
List<ImageParam> ImageParamList = new List<ImageParam>();
for (int i = 0; i < 200; i++)
{
string fileName = "蘋果.jpeg";
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
ImageParam imageParam = new ImageParam();
Bitmap bitmap = new Bitmap(fs);
Bitmap newBitmap = new Bitmap(bitmap.Width, bitmap.Height);
Graphics g = Graphics.FromImage(newBitmap);
g.DrawImage(bitmap, new Point(0, 0));
bitmap.Dispose();
imageParam.Index = i;
imageParam.img = newBitmap;
ImageParamList.Add(imageParam);
}
}
DateTime startTime = DateTime.Now;
SavaImage(ImageParamList);
DateTime endTime = DateTime.Now;
double diffTime = (endTime - startTime).TotalMilliseconds;
Console.WriteLine(diffTime);
}
private void SavaImage(List<ImageParam> ImageParamList)
{
foreach (var item in ImageParamList)
{
string fileName = $"{item.Index }.bmp";
item.img.Save(fileName);
}
}
}
class ImageParam
{
public int Index { get; set; }
public Bitmap img;
}
2、并行處理
為了加快圖像保存的速度,我們使用C#中的并行計算功能,所謂并行計算在C#中其實使用了多個線程同時對集合中的數據進行處理,這樣能夠充分利用電腦資源來加速對集合數據的處理,我這里定義了一個SavaImageParallel方法,對集合調用AsParallel().ForAll(),這個ForAll里面傳入的是一個委托,這樣就能實現并行處理,經過實際測試SavaImageParallel方法使用并行處理后,200個圖像存儲到本地只需要3秒,快了7倍左右,堪稱程序性能優化的神器,兄弟們快在項目中用起來吧!
private void SavaImageParallel(List<ImageParam> ImageParamList)
{
ImageParamList.AsParallel().ForAll(item => {
string fileName = $"{item.Index }.bmp";
item.img.Save(fileName);
});
}
該文章在 2025/4/27 18:38:19 編輯過