簡體   English   中英

優化Java陣列復制

[英]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.

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