我已根据here
的答案编写了代码我的示例代码如下
void Process(int i)
{
input = (Bitmap)Bitmap.FromFile(@"filepath.bmp");
Bitmap temp = new Bitmap(input.Width, input.Height,
PixelFormat.Format24bppRgb);
Graphics g = Graphics.FromImage(temp);
g.Clear(Color.Red);
g.DrawImage(input, Point.Empty);
temp.Save(stream, ImageFormat.Bmp);
//I need this stream thats further processing
}
void timer_Ex()
{
int i = 11;
for (; ; )
{
if (i == 335) break;
else
{
st.Start();
Process(i);
st.Stop();
Console.WriteLine(st.ElapsedMilliseconds.ToString());
//This time is more than the time in which thread sleeps
st.Reset();
Thread.Sleep(70);
i++;
}
}
}
所以我试图将图像从rgb32转换为rgb24。但是处理所需的时间比线程休眠的时间要长。它只是一个示例代码。所以请帮我解决这个问题 “我如何优化进程(int i)以在20 ms或低于100 ms内执行?”
答案 0 :(得分:6)
显着改善代码的事情: -
您的“输入”图片始终是相同的图片。但是每次调用Process()时都会加载它。使其成为会员,并仅加载一次。
每次调用Process()时都会分配“temp”位图,同样不需要。使其成为会员,并分配一次。
您不会丢弃任何Graphics对象。当你完成位图时应该处理位图,就像Graphics一样。
不是真正的表演,但你的for循环非常奇怪,而且难以理解。为什么要尝试重新构建内置的语言结构?
有什么问题for (int i=11; i != 335 ; i++)
{
st.Start();
Process(i);
st.Stop();
Console.WriteLine(st.ElapsedMilliseconds.ToString());
//This time is more than the time in which thread sleeps
st.Reset();
Thread.Sleep(70); }
答案 1 :(得分:1)
其余部分;这取决于。输入大小,机器配置(dx版本,显卡),使用C和p / invoke的技能。
答案 2 :(得分:1)
由于您要制作相同尺寸的图像,因此可以删除以下行
g.Clear(Color.Red);
它可能没什么区别,但可以减少你的时间
答案 3 :(得分:1)
您可能希望并行运行它 - 虽然每个图像仍然需要相同的时间,但您可以一次处理更多(假设您的CPU中有超过1个核心)