簡體   English   中英

Java陣列效率

[英]Java Array Efficiency

我不是100%肯定該機制在行動所以我決定在此發布以進一步澄清。

我正在做一個應該用Java處理大量數據的項目(它必須是Java)。 我希望它盡可能高效。 有效率我的意思是內存和速度計算應首先進入,可讀性應該排在第二位。

現在我有兩種方法來存儲我的數據:創建一個MyObject數組

1) MyObject[][] V = new MyObject[m][n]

或者創建兩個int數組:

2) int[][] V = new int[m][n]

3) int[][] P = new int[m][n]

顯然, MyObject包含至少兩個字段和一些方法。 現在我注意到,在循環遍歷MyObject數組以分配值時,我必須調用new ,否則我會得到一個空指針異常。 這意味着第1行中的new是不夠的。 這是一個比參數更昂貴的操作, P[i][j]=n ,考慮到數組也是Java中的對象?

我經常通過分析發現,用幾個標量數組替換一個對象數組可以提高內存消耗和性能。

但是,只有剖析可以判斷它是否值得在您的情況下進行優化。

一個好的分析器可以讓您測量代碼的性能和內存占用量。

這是一個比參數更昂貴的操作,P [i] [j] = n,考慮到數組也是Java中的對象?

在第一種情況下,您將創建一個數組對象,用於存儲類型為array的其他對象。 數組對象和要存儲在數組中的對象都需要實例化,這意味着您將需要m * n + 1對象實例化以及(m * n + 1) * objectSize內存消耗。

在第二種情況下,您只需要實例化數組對象; int基元不是對象,所以這應該更快,也更高效,因為對象內存大小是int的幾倍。 這里你基本上有1個對象實例化和(m * n) * intSize + objectSize內存消耗。

使用原語的另一個原因是,當用作局部變量時,它們被保存在堆棧中; 在將計算值存儲在數組中之前,您可能會在方法中使用中間局部變量,並且這些變量的內存的分配/釋放時間比生存在堆上的對象的分配/釋放時間高幾倍。

為了快速處理真正大量的數據,最好將數據放在一個連續的內存塊中,使得一起訪問的數據彼此接近。 這應該最大限度地減少緩存未命中,這是當今性能最差的殺手之一。

在java中,您只需使用一個基本的一維基本數組即可實現此目的。 如果使用兩個數組甚至二維數組,則不再保證數據位於一個連續的塊中。

另一個稍微涉及更多的解決方案是使用堆外數據結構,如下所示: http//mechanical-sympathy.blogspot.com/2012/10/compact-off-heap-structurestuples-in.html

首先,您必須在java而不是數組中使用List或Set ie Collections。 因為您可能不知道需要處理的數據大小。 此外,集合具有API方法,允許您像插入元素或刪除元素一樣輕松執行操作。 使用數組非常復雜且容易出錯,因為您可能需要反復迭代它,並且還必須在編譯時確定大小,如果您有可變大小的數據,這是不可能的。

此外,在運行時分配內存(即使用新關鍵字)是昂貴的,然后只是將值分配給已存在的對象,即p [i] [j] = v;

暫無
暫無

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

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