System.arraycopy是我的答案。請讓我知道有沒有更好的方法。 THX
private static long[] r1 = new long[64];
private static long[][] r2 = new long[64][64];
/**Proved:
* {@link Arrays#fill(long[], long[])} makes r2 has 64 references to r1 - not the answer;
* {@link Arrays#fill(long[], long)} sometimes slower than deep 2 looping.<br/>
*/
private static void testFillPerformance() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println(sdf.format(new Date()));
Arrays.fill(r1, 0l);
long stamp0 = System.nanoTime();
// Arrays.fill(r2, 0l); -- exception
long stamp1 = System.nanoTime();
// System.out.println(String.format("Arrays.fill takes %s nano-seconds.", stamp1 - stamp0));
stamp0 = System.nanoTime();
for (int i = 0; i < 64; i++) {
for (int j = 0; j < 64; j++)
r2[i][j] = 0l;
}
stamp1 = System.nanoTime();
System.out.println(String.format("Arrays' 2-looping takes %s nano-seconds.", stamp1 - stamp0));
stamp0 = System.nanoTime();
for (int i = 0; i < 64; i++) {
System.arraycopy(r1, 0, r2[i], 0, 64);
}
stamp1 = System.nanoTime();
System.out.println(String.format("System.arraycopy looping takes %s nano-seconds.", stamp1 - stamp0));
stamp0 = System.nanoTime();
Arrays.fill(r2, r1);
stamp1 = System.nanoTime();
System.out.println(String.format("One round Arrays.fill takes %s nano-seconds.", stamp1 - stamp0));
stamp0 = System.nanoTime();
for (int i = 0; i < 64; i++)
Arrays.fill(r2[i], 0l);
stamp1 = System.nanoTime();
System.out.println(String.format("Two rounds Arrays.fill takes %s nano-seconds.", stamp1 - stamp0));
}
十二時33分十八秒
陣列2-循環需要133536毫微秒。
System.arraycopy循環需要22070納秒。
一輪Arrays.fill需要9777納秒。
兩輪Arrays.fill需要93028納秒。
12:33:38
陣列的2-looping需要133816納秒。
System.arraycopy循環需要22070納秒。
一輪Arrays.fill需要17042納秒。
兩輪Arrays.fill需要95263納秒。
12:33:51
陣列的2循環需要199187納秒。
System.arraycopy循環需要44140納秒。
一輪Arrays.fill需要19555納秒。
兩輪Arrays.fill需要449219納秒。
12:34:16
數組的2循環需要199467納秒。
System.arraycopy循環需要42464納秒。
一輪Arrays.fill需要17600納秒。
兩輪Arrays.fill需要170971納秒。
12:34:26
陣列的2迴路需要198907納秒。
System.arraycopy循環需要24584納秒。
一輪Arrays.fill需要10616納秒。
兩輪Arrays.fill需要94426納秒。
在編的JDK代碼的版本顯示,在JDK的某些版本做了「調酒」:外部標記的地方表示數組邊界檢查應在方法繞過,然後明確在循環之外添加邊界檢查。這提供了顯着的性能提升,因爲邊界檢查本身不僅昂貴,而且使其他優化複雜化。 – 2012-02-03 17:19:02
@Bombe它是一個自定義的密碼字段,所以我必須用''''''動態地替換文檔中的每個'char' - 這意味着它必須儘可能的快速響應。可能會說你爲什麼不爲每個指數設定價值?這是爲了和'drawString'一起使用,所以我可以反編譯•的文本。 「填充」似乎運作良好。 :) – rtheunissen 2012-02-04 00:28:19
@ paranoid-android,所以你確實有能夠輸入每秒超過1000個字符的用戶?我很佩服。 – Bombe 2012-02-04 02:14:28