我在java中实现了一个代码,它的for循环从0到0x10000不等。 现在我将此代码导入android并运行相同的代码。
问题如果: 在Core中,java循环在最多2秒内执行。 但是当在android中执行相同的循环时,它需要4分钟(恶心)
任何人都可以帮助我解决这个问题,我为了你的理解而粘贴我的循环:
for (int r = 0; r < 0x10000; r++) {
for (int j = 0; j < password.length; j += 4) {
long[] key = {0, 0, 0, 0};
for (int i = 0; i < 4; i++) {
if (i + j < password.length) {
//do something
}
}
//calling one method.
}
}
基本上主循环变化高达64000次。请建议。
答案 0 :(得分:0)
这可能会有所帮助:
int maxR = 0x10000;
int passwordLength = password.length;
for (int r = 0; r < maxR; r++) {
for (int j = 0; j < passwordLength; j += 4) {
long[] key = {0, 0, 0, 0};
for (int i = 0; i < 4; i++) {
if (i + j < passwordLength) {
//do something
}
}
//calling one method.
}
}
但我认为优化的事情可能是你最后一个for循环的内容以及你之后调用的方法...
[编辑] 如果你不能访问“key”数组的其他项而不是索引i的那些项,你可以做Joop Eggen建议的那样:
int maxR = 0x10000;
int passwordLength = password.length;
long[] key = {0, 0, 0, 0};
for (int r = 0; r < maxR; r++) {
for (int j = 0; j < passwordLength; j += 4) {
for (int i = 0; i < 4; i++) {
key[i] = 0;
if (i + j < passwordLength) {
//do something
}
}
//calling one method.
}
}
答案 1 :(得分:0)
long[] key = new long[4];
int incompleteFourer = password.length % 4;
int n = password.length - incompleteFourer ;
for (int r = 0; r < 0x10000; r++) {
for (int j = 0; j < n; j += 4) {
for (int i = 0; i < 4; i++) {
key[i] = 0;
//do something
}
//calling one method.
}
if (incompleteFourer != 0) {
int j = n;;
//calling one method.
}
}
仅key
的内存分配一次;假设“做某事”只考虑key[i]
。
j的索引总是有4个元素; “调用一个方法”可能无法处理最后三个元素中的一些。
最后1到3个元素是分开处理的。
NetBeans IDE有一个很好的分析器,可能同样的瓶颈涉及两个循环。至少测量Android上的独立调用次数;也许这是一个缓慢的Dalvik实现的一些基本功能。