繁体   English   中英

将8位数字转换为char的算法的优化

[英]Optimization of algorithm that convert 8-bit number to char

我需要将一个8位数字(例如00001110为char。 这个问题很容易,所以我写了代码,一切都正常,但是现在我需要尽可能地优化速度。

在测试课中:

 class Program
 {
    static void Main(string[] args)
    {
        Random r = new Random();
        int[] testTab = new int[8];
        Normal n = new Normal();
        long time;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < 9000; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                testTab[j] = r.Next(2);
            }
            n.SetTable(testTab);
            n.Decode();
        }
        watch.Stop();
        time = watch.ElapsedTicks;
        Console.WriteLine(time);
        time = watch.ElapsedMilliseconds;
        Console.WriteLine(time);
        Console.ReadKey();
    }
 } 

和类与算法:

class Normal
{
    private int[] _tab = new int[8];

    public void SetTable(int[] tab)
    {
        _tab = tab;
    }
    public void Decode()
    {
        char a = ((char)( _tab[0]*1 + _tab[1]*2 + _tab[2]*4 + _tab[3]*8 + _tab[4]*16 + _tab[5]*32 +
                          _tab[6]*64 + _tab[7]*124));
    }
}

在输出9000次中,我得到2ms的时间,这不是很长的时间(对于9000),但是我的PC上具有良好的处理能力。

最终代码将在智能手机中运行,因此没有强大的CPU。 在我的算法中,我使用随机数据,在最终版本中,我将通过Camera加载数据(这样会更长),并尝试在一秒钟内重复执行10次此操作,因此这就是为什么我需要最小时间的最佳时间。

有没有比这更快的将字节转换为char的方法?

char a = ((char)( _tab[0]*1 + _tab[1]*2 + _tab[2]*4 + _tab[3]*8 + _tab[4]*16 + _tab[5]*32 + _tab[6]*64 + _tab[7]*128));

tl; dr您的转换代码已经有效,而不是您的瓶颈。


您的基准测试存在缺陷。 您不仅在计时将int[]存储的二进制数转换为整数值。 您还将定时生成随机数据。 我希望大部分时间都花在生成随机数据上。

重新编写基准测试程序,以处理开始计时之前准备的数据。 确保测试持续时间至少为5或10秒,以便您生成有意义的答案。 如果仅运行两毫秒,那么计时器的粒度会影响结果的质量。

请记住,在实际的应用程序中,您将在QR码相机上拍照并对其进行解码。 其成本比转换8位int数组的成本高出许多数量级。

您进行转换的代码已经非常有效。 不要寻求进一步优化。 不仅没有必要对其进行优化,而且获得巨大收益的希望很小。 为了清楚和简洁起见,您可以选择使用一种执行此类转换的.net库方法,但是程序这一部分的性能不是问题。

顺便说一句,您似乎需要将8位值转换为字节,将这些值添加到字节数组,然后馈入Encoding.GetString以获取文本。 按照您的代码char为UTF-16 char不正确。

值得尝试一下:

var yourString = "00100000";
char yourChar = (char) Convert.ToByte(yourString, 2); // you got ' ' (space)

它可能会或可能不会更快,但绝对会更简单,更稳定,更可维护。

我用不同的实现进行了一些测试。 首先是@Melnikovl的答案。 第二个是我的,我用|代替+ | *<<运算符。 第三是作者的原始解决方案。

我使用修改后的代码进行了测试,仅测量了转换代码。 第一个和第二个解决方案显示出更好的性能。 但是BitConverter经常多一点更好,所以我认为您应该选择它(也是因为如果代码简单)

var byte[] bytes = { 1, 1, 1, 1 };
int i = BitConverter.ToInt32(bytes, 0);
char a = (char)i;

不要忘了检查字节数组litte还是big endian

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM