最近使用同事写的代码,功能是对特定格式的数据进行解析,最终得到一些元信息和浮点数数组,最后对数据进行应用。
使用过程中发现,在数据很小的情况下,性能正常,在几十毫秒即可解析完成。但当数据很大时,数组长度100多万,解析则很慢,1个数据需6-7秒,而这要在客户端上应用,是不可接受的,并且,数据是好几十个的。
经查,性能卡在字节数组到浮点数组的转换上。原代码是每4个字节转换为浮点数,再存入数组。如此逐一转换后,在数据小的性况下没问题,当数据大时,问题就出现了。
如果可以一次性完成,则性能问题应该可以解决。c# 中有个BlockCopy,可以对数组进行一整块的转换:
float[] destDataArr = new float[sourceBytesArr.Length];
Buffer.BlockCopy(sourceByteArrs, 0, destDataArr, 0, sourceByteArr.Length);
以上字节数组sourceBytesArr 为小端(little endian)顺序;若为大端(big endian),则需要先反转下数组的顺序,Array.Reverse(sourceBytesArr)
,然后,对得到的结果destDataArr再反转一次即可,即 Array.Reverse(destDataArr)
。
最后测试,数组长度为100多万时,也只需30-40毫秒即可完成,性能提升10多倍。对于小点的数据,则是几毫秒级别的。
网友评论