[英]Slow recursive function. How can I speed it up?
下面是一個不執行任何操作的遞歸函數。 real函數進行了一些檢查,這些檢查實際上可以刪除一些遞歸調用,但這只是簡化問題的一個示例。
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);
}
}
}
}
在我低調的HTC Flyer安卓平板電腦上,使用包含“ srrieca *”的數組調用speedtest最多需要5秒鍾。 在這個極端的例子中,該函數被稱為1 274 928次,但仍然如此。
我敢肯定,有一些事情可以提高這個例子的速度。
內存分配是一項昂貴的操作。 該new
聲明降低了您的速度。 嘗試為工作區域分配一個大塊並留在其中。
另外,您將經常觸發垃圾收集器,這是一個更大的減速。
您可以通過合並tmp
數組來減少垃圾回收器的開銷。 當然,在檢查完這是您遇到的瓶頸之后。
一種可能性涉及通過具有某種可以存儲可重用而不是遞歸的結果的緩存來減少遞歸調用的數量。 盡管在您想像的示例中,尚不清楚會是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.