nic*_*ckf 13 javascript html5 local-storage web-storage
*"高效"这里基本上意味着更小的尺寸(减少IO等待时间),以及快速的检索/反序列化时间.存储时间并不重要.
我必须在浏览器的localStorage中存储几十个整数数组,每个数组都有一个范围为0-50的1800个值 - 也就是说,作为一个字符串.
显然,最简单的方法是,只要JSON.stringify它,它会增加许多不必要的信息,考虑到数据的范围是众所周知的.其中一个数组的平均大小为~5500字节.
以下是我尝试过的其他一些方法(结果大小,以及最后反序列化1000次的时间)
对数字进行零填充,使每个长度为2个字符,例如:
[5, 27, 7, 38] ==> "05270738"
Run Code Online (Sandbox Code Playgroud)base 50编码:
[5, 11, 7, 38] ==> "5b7C"
Run Code Online (Sandbox Code Playgroud)只使用该值作为字符代码(添加32以避免开始时奇怪的控制字符):
[5, 11, 7, 38] ==> "%+'F" (String.fromCharCode(37), String.fromCharCode(43) ...)
Run Code Online (Sandbox Code Playgroud)这是我的结果:
size Chrome 18 Firefox 11
-------------------------------------------------
JSON.stringify 5286 60ms 99ms
zero-padded 3600 354ms 703ms
base 50 1800 315ms 400ms
charCodes 1800 21ms 178ms
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果有一个更好的方法,我还没有考虑过?
更新
MДΓΓБДLL建议对数据使用压缩.将此LZW实现与基础50和charCode数据相结合.我还测试了aroth的代码(将4个整数打包成3个字节).我得到了这些结果:
size Chrome 18 Firefox 11
-------------------------------------------------
LZW base 50 1103 494ms 999ms
LZW charCodes 1103 194ms 882ms
bitpacking 1350 2395ms 331ms
Run Code Online (Sandbox Code Playgroud)
假设(如您的测试中所示)压缩所花费的时间比大小减少节省的时间更多,则您的 char 编码是在不进行位移的情况下获得的最小编码。目前,每个数字使用一个字节,但如果保证它们足够小,您可以在每个字节中放入两个数字。这可能是过度优化,除非这是代码中非常热门的部分。