c# - 如何加快这个计算

标签 c# performance

给定以整数表示的两种 ARGB 颜色,8 位/ channel (alpha、红色、绿色、蓝色),我需要计算一个值来表示它们之间的某种距离(也是整数)。

所以距离的公式是:Delta=|R1-R2|+|G1-G2|+|B1-B2| 其中 Rx、Gx 和 Bx 是 channel 的值颜色 1 和 2。始终忽略 Alpha channel 。

我需要加快计算速度,因为它在一台慢速机器上完成了很多次。在给定两个整数的情况下,在单个线程上计算这个的“极客”方法是什么。

到目前为止我最好的是,但我想这可以进一步改进:

    //Used for color conversion from/to int
    private const int ChannelMask = 0xFF;
    private const int GreenShift = 8;
    private const int RedShift = 16;

    public int ComputeColorDelta(int color1, int color2)
    {
        int rDelta = Math.Abs(((color1 >> RedShift) & ChannelMask) - ((color2 >> RedShift) & ChannelMask));
        int gDelta = Math.Abs(((color1 >> GreenShift) & ChannelMask) - ((color2 >> GreenShift) & ChannelMask));
        int bDelta = Math.Abs((color1 & ChannelMask) - (color2 & ChannelMask));

        return rDelta + gDelta + bDelta;
    }

最佳答案

长答案:

多少是“很多”

我想我有一台速度很快的机器,但我写了这个小脚本:

 public static void Main() {
            var s = Stopwatch.StartNew();
            Random r = new Random();
            for (int i = 0; i < 100000000; i++) {
                int compute = ComputeColorDelta(r.Next(255), r.Next(255));
            }
            Console.WriteLine(s.ElapsedMilliseconds);
            Console.ReadLine();
        }

输出是: 6878

所以 7 秒 1 亿次似乎很不错。

不过,我们肯定可以加快速度。我将您的功能更改为如下所示:

public static int ComputeColorDelta(int color1, int color2) {
  return 1;
}

随着这一变化,输出为:5546。因此,我们通过返回一个常量成功地在 1 亿次迭代中获得了 1 秒的性能提升。 ;)

简短回答:此功能不是您的瓶颈。 :)

关于c# - 如何加快这个计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311946/

相关文章:

mysql - 快速组 rank() 函数

c# - 我需要在 C# 中为缩放后的图像设置别名

C# 读取包含由制表符分隔的数据的文本文件

c# - 如何调用线程中使用的代码

c# - UTF-8 文件数据到 ASCII

windows - "too many"是多少个正在使用的 Windows 句柄?

iphone - 如何在 Xcode 中减少构建时间/加快编译时间?

python - 计算销售额的滚动(滞后和超前)差异的最佳方法是什么?

java - 我应该如何并行化计算成本高昂的 for 循环并整理迭代结果?

c# - 'Property:NETFRAMEWORK45' 部分中对符号 'Product:*' 的未解决引用