1

我在 java 中实现了一个代码,它有一个从 0 到 0x10000 次变化的 for 循环。现在我将此代码导入 android 并运行相同的代码。

如果出现问题:在核心 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 次。请建议。

4

2 回答 2

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 循环的内容和你在它之后调用的方法......

[编辑]如果您无法访问“键”数组的其他项而不是索引 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.
    }
}
于 2013-06-19T11:12:16.393 回答
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 实现。

于 2013-06-19T11:14:57.190 回答