2013-03-14 83 views
0

行,所以我重新格式化後,使其更容易稍懂(抱歉所有pastebins但堆棧溢出當時正在與代碼格式化啞)集<> = Sets.newHashSet()

請注意,我不打算有如下所述的存儲數據的荒謬數量。 我使用我說的量的主要原因是爲了儘可能地提高效率。

可以說我有下面的代碼(S)

將被添加到DropItemQueue方法(始於floodFill(深度0)其它PARAMATERS並不重要)

http://pastebin.com/3wqEb5cM

這是相同的類,然後它會調用掉物品開關DROPITEM方法utils的

http://pastebin.com/yEUW9Wad

我Utils.dropItem方法如下

http://pastebin.com/c0eaWeMA

這是ServerTickHandler.addDropItemQueue方法及其變量存儲

http://pastebin.com/Q4p5a4ja

這裏是DropItemQueue類

http://pastebin.com/wxCj9imN

如果我是說添加億個元素到此HashSet的我已經注意到,大約需要2秒

迭代高於一切使用 這個迭代器被稱爲的seccond

http://pastebin.com/zSWg1kKu

2,每1/20日的HashSet每次迭代的秒數似乎並不多,但用這些元素來擺脫散列集中存儲的每一個元素大約需要50天

每次元素被分析到散列集時maxTicks都是1比以前增加的el更多因此基本上每1秒鐘一個物品被丟棄,但由於2秒鐘的時間來重複其實際需要3秒的時間來丟棄物品,這將需要大約150天的時間來完成迭代並沖刷每個元素並完成

我的問題是,如果擁有多個散列集合,並且最大元素數量少於1000個元素,它會更快嗎?

是的,這會給我100000個哈希集,但是由於它們每個都比較小,迭代次數會更慢(這只是效率的一個非常小的增加),還是有其他更好的方法,除了哈希集或哈希集最好的東西使用?

也注意到,如果我沒有使用較小的迭代多次迭代我不能使用線程由於跨線程的數據冗餘

+0

您的程序流程仍不清楚您發佈的內容。你能包括更完整的樣本嗎? – 2013-03-14 20:03:13

+2

你真的有一個有1億個元素的哈希集?移除一個元素需要一段時間並不令人意外,但2秒看起來非常糟糕。也許你的程序由於物理內存不足而發生顛簸?你有沒有嘗試分析,看看時間到了哪裏?此外,隨着元素被刪除,該過程應該會顯着加速,因此您無法從最壞情況下的迭代時間估計總體時間。 – 2013-03-14 20:14:56

+0

@TedHopp在實際情況下,其中不會有1億個元素,但問題的主要原因是提高大數量的效率。 malcom給我一分鐘,並重新調整代碼的工作方式 – 2013-03-14 20:23:01

回答

1

HashSet數據結構是專爲真的只有一個目的,那就是要回答這個問題「這個集合是否包含這個項目「。對於任何其他用途,它不一定是最有效的。

對於您的使用,它似乎是一個隊列將是一個更好的選擇。

+0

爲什麼隊列會更好? OP似乎沒有興趣維護元素之間的順序,集合迭代器和隊列迭代器一樣高效。如果有的話,從隊列中移除元素將比從HashSet中移除要慢(取決於所使用的隊列結構)。 – 2013-03-14 20:16:32

+0

我建議Queue離開我的頭頂,但List也可以。我不喜歡HashSet的主要原因是這些項目可能沒有連續存儲(因爲它們在散列上被索引),所以構建迭代器比說像鏈接列表(或隊列)要慢。 – 2013-03-14 20:37:19

+0

如果它是排序或不排序,我不會感到困擾。 – 2013-03-14 20:53:03

相關問題