[英]Optimizing Java Array Copy
因此,對於我的研究小組,我嘗試將一些舊的C ++代碼轉換為Java,並遇到一個問題,其中在C ++代碼中它執行以下操作:
method(array+i, other parameters)
現在我知道Java不支持指針算術,因此通過將子數組從array + i復制到數組的末尾到新數組中來解決了這個問題,但是這導致代碼運行緩慢(即比C ++慢100倍)版)。 有辦法解決這個問題嗎? 我看到有人在這里提到一個內置方法,但是這樣更快嗎?
您的代碼不僅變慢,而且還改變了正在發生的事情的語義:當您在C ++中進行調用時,不會進行數組復制,因此,可能應用於該數組的任何method
更改都發生在原始數組中,而不是在數組中。一次性的副本。
要在Java中達到相同的效果,請按如下所示更改函數的簽名:
void method(array, offset, other parameters)
現在,調用者必須傳遞數組在該method
應考慮數組“虛擬零”的位置。 換句話說,而不是寫類似
for (int i = 0 ; i != N ; i++)
...
你將不得不寫
for (int i = offset ; i != offset+N ; i++)
...
這將保留將數組傳遞給成員函數的C ++語義。
C ++函數可能依賴於array
開頭的處理。 在Java中,應將其配置為從偏移量運行到數組中,因此不需要復制數組。 即使使用System.arraycopy
,復制數組也要花費大量時間。
可以將其定義為具有以下內容的Java方法:
void method(<somearraytype> array, int offset, other parameters)
然后,該方法將從數組的偏移量開始,並將其命名為:
method(array, i, other parameters);
如果希望將子數組傳遞給方法,則將子數組復制到新數組中的另一種方法是將整個數組與附加offset
參數一起傳遞,該參數指示數組的第一個相關索引。 這可能需要更改method
的實現,但是如果性能是一個問題,那可能是最有效的方法。
解決此問題的正確方法是重構方法,獲取簽名
method(int[] array, int i, other parameters)
這樣就可以傳遞整個數組(通過引用),然后告訴該方法從何處開始對其進行處理。 然后,您無需進行任何復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.