簡體   English   中英

這是Java中更有效的整數數組大小

[英]Which is a more efficient integer array size in Java

好的,所以我正在研究一個自定義數據結構,該結構使用相當多的數組來有效地高效存儲大量(數百萬個條目),但是我想知道; 調整數組大小的最有效方法是什么?

我的自然傾向是使用二進制冪來選擇數組大小,例如-4、8、16等大小,但是由於Java數組還包括它們的長度,因此我應該將其視為一個附加元素,即-如果我m存儲整數數組,我應該使用3、7、15等大小來代替額外的整數嗎?

我意識到在大多數情況下這可能是學術上的,但是選擇新的數組大小已經在我的代碼中是其自身的功能,因此很難調整,而且我很想知道。

數組大小唯一會影響的是數組已滿。 與哈希表不同,在哈希表中,您經常需要執行模運算(如果您知道大小是2的冪,可以對其進行優化),普通數組僅需要比較大小,並且對所有值的比較一致地快。

盡管如此,不同的初始容量和不同的增長因素可能會影響程序性能或內存消耗,但這僅僅是因為某些增長模式可以更好地“適應”某些使用,因為它們可以更好地平衡浪費在過度分配上的空間和調整大小所需的時間(均攤銷) O(1),但仍受隱藏常數因素的影響)。 但是,這完全取決於典型程序在典型輸入上的行為。 您不能通過盯着數組實現來孤立地決定。

在沒有更多數據的情況下,您應該選擇一個任意但合理的起始容量(我會說介於1到30之間)和增長因子(我會說介於1.5到3之間)。 在最壞的情況下,它會使性能降低一個恆定的因素,而在那方面卻很小。 如果要使API稍微復雜一點,也可以讓用戶選擇它。

我在這里問了基本相同的問題: 根據JVM的內存粒度確定數組的最佳大小 (但沒有得到有用的響應)

選擇理想的陣列大小的主要問題是,它需要了解VM如何在內存中實際布置陣列,並且無法預先確定,因為它在很大程度上取決於平台架構,而且還取決於VM版本以及VM 參數 (例如,使用64位打開/關閉壓縮OOP)。

但是,您可以查找典型VM設置的粒度,或者只是將合理的假設硬編碼到陣列大小選擇中。

編輯:有一個解決方案,但它不是可移植的(使用Unsafe類): http : //openjdk.java.net/projects/code-tools/jol/

暫無
暫無

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

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