編輯:所以,這隻發生在android上,在桌面上的結果幾乎相同,但在Android醜陋的代碼是10倍更快。在Mac上測試android 4.4(samsung galaxy s4),android 8(nexus 6p),android模擬器。安卓方法調用性能
我的Android程序的重構代碼後,我注意到,該方法調用是非常性能昂貴。比方說,我有一個類
public class Chunk {
private byte[] chunkArray;
private ChunkGetter chunkGetter;
public Chunk() {
chunkArray = new byte[65536];
chunkGetter = new ChunkGetter();
}
public byte getByteFromArray(int x, int y, int z) {
return chunkGetter.getBlockId(x, y, z, chunkArray);
}
public byte[] getChunkArray() {
return chunkArray;
}
}
和消氣劑從塊陣列獲取數據:
public ChunkGetter() {
}
public byte getBlockId(int x, int y, int z, byte[] blocksByteArray) {
return blocksByteArray[getCoordinateOffset(x, y, z)];
}
public static int getCoordinateOffset(int x, int y, int z) {
return x * 256 * 16 + z * 256 + y;
}
所以,一個簡單的得到測試給了我這些結果:
private void runTest() {
Chunk chunk = new Chunk();
long start = System.nanoTime();
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
for (int y = 0; y < 256; y++) {
byte id = chunk.getByteFromArray(x, y, z);
}
}
}
LOG("test took: " + (System.nanoTime() - start)/1000000 + " ms");
}
first call: test took: 19 ms
second call: test took: 16 ms
third call: test took: 17 ms
但是如果我直接從陣列中獲取數據 - 它的速度快了20倍:
private void runTest() {
Chunk chunk = new Chunk();
byte[] chunkArray = chunk.getChunkArray();
long start = System.nanoTime();
for (int x = 0; x < 16; x++) {
for (int z = 0; z < 16; z++) {
for (int y = 0; y < 256; y++) {
byte id = chunkArray[x * 256 * 16 + z * 256 + y];
}
}
}
LOG("test took: " + (System.nanoTime() - start)/1000000 + " ms");
}
first call: test took: 1 ms
second call: test took: 1 ms
third call: test took: 1 ms
這段代碼不可讀也不靈活,但是在使用它時,我的程序在1.5秒內運行init方法,並且在使用方法時 - 它在9秒內運行!如何在沒有醜陋的複製粘貼的情況下實現良好的表現?
通常:https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – GhostCat
好的,時間學習如何做基準:)但即使沒有基準,我可以在第二種情況下立即看到結果,而在第一種情況下(我使用方法),我需要等待。 – user3470643