gpt4 book ai didi

c# - 更快的 c# 图像处理

转载 作者:行者123 更新时间:2023-11-28 06:17:41 28 4
gpt4 key购买 nike

我有一个相当广泛的 c++ 图像处理库,我一直在从事一个 c# 项目,但我似乎无法使 c# 的速度接近 c++ 的速度。我的 C++ 需要 149 毫秒来处理将整个图像设置为白色,而 C# 需要 1071 毫秒来完成相同的操作。

这是我的C++代码

for (int i = 0; i < 100; i++)
{
for (int y = 0; y < image->height; y++)
{
unsigned char * srcPixel = (unsigned char*)image->mImageData + (y * image->width);

for (int x = 0; x < image->width; x++)
{
srcPixel[0] = 255;
srcPixel[1] = 255;
srcPixel[2] = 255;
srcPixel[3] = 255;
srcPixel += 4;
}
}
}

mImageData 是一个无符号字符结构

struct mImageData
{
unsigned char alpha;
unsigned char red;
unsigned char green;
unsigned char blue;
}

这是我正在使用的 C# 代码。这是我能够获得的最快速度。

frame = new Bitmap(3840, 2160);
BitmapData bitmapData12 = frame.LockBits(new Rectangle(0, 0,
frame.Width, frame.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb);


var stopwatch = Stopwatch.StartNew();
unsafe
{
int pixelBytes = 4;
int paddingBytes = bitmapData12.Stride % pixelBytes;

byte* location1 = (byte*)bitmapData12.Scan0;

for (int i = 0; i < 100; i++)
{
location1 = (byte*)bitmapData12.Scan0;
for (int y = 0; y < bitmapData12.Height; ++y)
{
for (int x = 0; x < bitmapData12.Width; ++x)
{
location1[0] = 255;
location1[1] = 255;
location1[2] = 255;
location1[3] = 255;

location1 += pixelBytes;
}

location1 += paddingBytes;
}
}
}

stopwatch.Stop();
var miliseconds = stopwatch.ElapsedMilliseconds;

frame.UnlockBits(bitmapData12);

最佳答案

我使用 ResW = 3000 和 ResH = 3000 运行您的代码,以获得 900 毫秒的处理时间。我在 Release模式下运行它,调试器分离。

请注意,此图像包含 900 万个像素,每个像素长 4 个字节。需要填充 36 MB。我们对此进行了 100 次填充,因此总共要设置 36 亿字节。我的 CPU 运行在 4.5 GHz,因此它设法在 40 亿个时钟周期内设置了 36 亿字节

我想说这对于任何语言来说都不算太差。如果我要关闭我的开发机器上的所有虚拟机、后台进程和服务器(它们目前消耗 5% 到 20% 的 CPU)以运行更清洁的测量,我将在每个时钟周期得到几乎恰好一个字节集.当然,CPU 可以做得更好 - 如果您要求它们执行正确的操作。一次设置一个字节肯定会使速度变慢。

所以 C# 确实是在不修改算法的情况下尽可能快地执行此操作。只是 C# 拒绝优化代码的直译,而 C++ 可以而且将会这样做。在我自己的测试中,只需按照 AdamF 的建议(使用 uint)就可以将时间缩短到 300 毫秒。

我认为您没有指定 ResW/ResH 是什么(或者我是盲人),所以您仍然有可能没有以尽可能快的方式运行代码并且某些东西干扰了测量。

关于c# - 更快的 c# 图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com