Java 如何更快地将长数组保存为反向十六进制数?
我最近开始在android平台上开发。我正在开发一个应用程序,为了寻找一些线索,我正在查看他们提供的android音乐应用程序示例。Java 如何更快地将长数组保存为反向十六进制数?,java,android,performance,hex,Java,Android,Performance,Hex,我最近开始在android平台上开发。我正在开发一个应用程序,为了寻找一些线索,我正在查看他们提供的android音乐应用程序示例。 在应用程序中,在他们保存当前播放列表的地方,他们给出了一个我无法理解的论点。参数和代码如下所示: if (full) { StringBuilder q = new StringBuilder(); // The current playlist is saved as a list of "reverse hexadecimal
在应用程序中,在他们保存当前播放列表的地方,他们给出了一个我无法理解的论点。参数和代码如下所示:
if (full) {
StringBuilder q = new StringBuilder();
// The current playlist is saved as a list of "reverse hexadecimal"
// numbers, which we can generate faster than normal decimal or
// hexadecimal numbers, which in turn allows us to save the playlist
// more often without worrying too much about performance.
// (saving the full state takes about 40 ms under no-load conditions
// on the phone)
int len = mPlayListLen;
for (int i = 0; i < len; i++) {
long n = mPlayList[i];
if (n < 0) {
continue;
} else if (n == 0) {
q.append("0;");
} else {
while (n != 0) {
int digit = (int)(n & 0xf);
n >>>= 4;
q.append(hexdigits[digit]);
}
q.append(";");
}
}
然后“q”保存在SharedReferences中。以类似的方式,他们稍后使用这些十六进制数字检索列表。如果有人能解释一下这个代码片段的意义,我将不胜感激。我的意思是,这与直接使用长值创建字符串有什么不同 他们在这里所做的是一个非常简单的算法,以尽可能快地显示数字。对于每个数字,他们需要执行以下操作:
>>
&
append character looked up from array
然后,对于每个数字,它们附加一个代码>在末尾
这些操作中的每一个都非常快,因此最终的结果是从内存中提取长数据,并将其以紧凑的形式以尽可能最佳的速度以字符串形式输出
它是反十六进制的,因为最小的数字首先显示
这将比Java中内置的通用算法更快,尽管我会感到惊讶的是,如果节省的数量很大,除非他们节省了大量的数字。特别是,他们屏蔽了底部的4位,并写入十六进制数字(低阶数字)-int digit=(int)(n&0xf)编码>然后右移4位,写出高位n>>>=4代码>。非常快。@TimB感谢您快速、易懂的回复。我刚刚读了一些关于这些运算的书,读到逐位运算比普通的数学运算要快得多。但我想知道,如果说数组中有50个长数字,这会有多大区别?@Simon感谢您进一步解释。干杯相对而言,我希望它会更快。从绝对值来看,虽然我预计节省的钱只有50英镑,但实际上并不是很多。你唯一知道的方法就是测量它。没有指标,其他一切都是猜测。
>>
&
append character looked up from array