[英]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.