簡體   English   中英

Java中的查詢表

[英]Lookup table in Java

當我想加速部分代碼時,我使用查找表而不是函數。 在其他語言中,我使用全局數組來完成這項工作。 我預先計算了所有返回值,並將它們放入數組中。

這是一個函數示例:

public static int Box(int c) { /* c value range is 0-80 */
    return ((c / 9) / 3) * 3 + ((c % 9) / 3);
}

我可以改用這樣的數組:

int Box[] = {0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8,6,6,6,7,7,7,8,8,8}

Java沒有全局數組!

什么是執行此操作以便訪問這些值的最佳方法?

在Java中,等效於全局變量的是公共靜態變量。 如果要使靜態變量不可變,則還應將其聲明為final。

另外,Java中靜態變量的命名約定是將全名大寫,並用下划線分隔各個單詞(例如:SOME_BOX)。

使用上面的示例,您可以執行以下操作:

public static final int[] BOX = {0,0,0....};

您仍然可以使用全局變量。 您只需要將它們放在一個類中即可。

public class PrecalculatedValues{
    public static final int BOX[]={0,0,0,1,1,1,...};
}

您可以稍后在代碼中訪問BOX ,如下所示:

public static void main(String[] args) {
    System.out.println(PrecalculatedValues.BOX[0]);
}

盡管可以使用查找表,但是在這種情況下完全沒有必要,因為可以在幾個循環中無分支地計算方程。

當使用數組作為查找表時,由於ArrayIndexOutOfBounds檢查,將需要分支。

我建議將靜態數組放在該方法所在的類中,並且仍然從外部代碼中調用該方法,而僅從函數內部使用該數組。 是的,您將需要一些費用來進行一次funcall,但我想您是不是想獲得0.001%的性能? 而且,JIT可能會簡化它。 最重要的是,您的界面應保持一致,並且看起來像是正常功能,而不像某些hack。 如果您試圖通過預先計算從昂貴的函數中獲得一些性能,則還可以考慮使用記憶。 將這個數組隱藏在funcall后面的事情是,您以后可以使用任何緩存或預計算技術,而不會打擾公共接口。

例如

class A {
    private final static int values[] = {0, 1, 2 ... };

    public int myFun(int x){
        return values[x];
    }
}

對於一個,您可以只是簡化您的功能(/ 9/3 * 3和parens是非常不必要的。我知道這是一個示例,但總是在尋找簡化方法)

其次,如果您的函數足夠簡單,則“ spedup”方法不一定會更快。 通常,您的查詢表方法不能完全擴展

第三,如果您仍然想要查找表方法,只需創建一個保存值的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM