下面是一个什么都不做的递归函数。真正的函数做了一些实际上可以删除一些递归调用的检查,但这只是一个简化问题的例子。
public void speedtest2(char[] s) {
int a, c;
int l, lmax;
int arrlength = Array.getLength(s);
for (a = 0; a < arrlength; a++) {
if ((a == 0) || (s[a]) != s[a - 1]) {
if (s[a] == '*') {
lmax = 26;
} else {
lmax = 1;
};
for (l = 1; l <= lmax; l++) {
tot++;
char[] tmp = new char[arrlength - 1];
int p = 0;
for (c = 0; c < arrlength; c++) {
if (c != a) {
tmp[p++] = s[c];
};
};
speedtest2(tmp);
}
}
}
}
使用包含“srrieca *”的数组调用speedtest在我的低端HTC Flyer安卓平板电脑上最多需要5秒钟。在这个极端的例子中,该功能被称为1 274 928次,但仍然。
我很确定有什么可以提高这个例子的速度。
答案 0 :(得分:1)
内存分配是一项昂贵的操作。你的速度会被new
声明降低。尝试为工作区域分配一个大块,并保持在其中。
此外,你会经常触发垃圾收集器,这是一个更大的减速带。
答案 1 :(得分:1)
您可以通过合并tmp
数组来减少垃圾收集器开销。当然,在您检查到 是您的情况下的瓶颈之后。
答案 2 :(得分:1)
一种可能性是通过使用某种缓存来减少递归调用的数量,该缓存存储可以重复使用的结果,而不是递归。虽然在你做作的例子中,目前尚不清楚它会是什么。