我們?cè)陂_(kāi)發(fā)C#程序的時(shí)候,有時(shí)候遇到一些非常多的數(shù)據(jù)需要處理,尤其是我們要對(duì)一個(gè)集合中的數(shù)據(jù)做相同操作,這個(gè)集合中又包含了多個(gè)數(shù)據(jù),我們一般使用for循環(huán)對(duì)集合中的每個(gè)數(shù)據(jù)分別處理,這樣處理起來(lái)可能需要花費(fèi)很多的時(shí)間,那么有沒(méi)有能夠優(yōu)化這個(gè)處理時(shí)間的方法呢,本文就來(lái)幫助大家解決這個(gè)問(wèn)題!
1、傳統(tǒng)foreach循環(huán)處理
下面的代碼中使用Initialtest方法首先從本地讀取一個(gè)文件名叫 "蘋(píng)果.jpeg"的圖像,然后使用gdi技術(shù)復(fù)制這個(gè)圖像200遍,然后把這200個(gè)圖像存到ImageParamList 這個(gè)集合中,然后我們把這200個(gè)圖像保存到本地電腦中,由于圖像數(shù)據(jù)比較多,所以保存起來(lái)的速度比較慢,比如我這里定義了一個(gè)SavaImage方法,該方法使用foreach循環(huán)將ImageParamList 集合中200個(gè)圖像分別保存,在我的電腦上使用了差不多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 = "蘋(píng)果.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#中的并行計(jì)算功能,所謂并行計(jì)算在C#中其實(shí)使用了多個(gè)線程同時(shí)對(duì)集合中的數(shù)據(jù)進(jìn)行處理,這樣能夠充分利用電腦資源來(lái)加速對(duì)集合數(shù)據(jù)的處理,我這里定義了一個(gè)SavaImageParallel方法,對(duì)集合調(diào)用AsParallel().ForAll(),這個(gè)ForAll里面?zhèn)魅氲氖且粋€(gè)委托,這樣就能實(shí)現(xiàn)并行處理,經(jīng)過(guò)實(shí)際測(cè)試SavaImageParallel方法使用并行處理后,200個(gè)圖像存儲(chǔ)到本地只需要3秒,快了7倍左右,堪稱(chēng)程序性能優(yōu)化的神器,兄弟們快在項(xiàng)目中用起來(lái)吧!
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 編輯過(guò)