Java迭代HashTable与ArrayList速度
我正在编写一个简单的 3D SW 渲染引擎。我有一个包含整个场景的默认 ArrayList
因此,我首先想到的是使用 Hashtable
作为场景 ArrayList
的名称和索引。但是,后来我想我可以直接使用 Hashtable
保存场景,然后使用迭代器遍历它进行渲染。
所以我想问一下,在3D引擎中,什么是速度优先?因为与选择对象相比,我每秒会多次循环场景。 ArrayList
比迭代哈希表
快吗?谢谢。
I am writing a simple 3D SW rendering engine. I have a default ArrayList<Object3D>
containing the whole scene. Now, I want to be able to add, remove and select objects by name, like 3D editors do (because its MUCH more simple than mouse select, but still looking good in homework :) ).
So, the first thing I thought is to have Hashtable
for name and index to scene ArrayList
. But, then I thought I could just simply save the scene using Hashtable
directly, and go through it to render using iterator.
So I want to ask, in a 3D engine, what is speed-preferable? Because I will for-loop the scene many times per second, compared to selecting object. Is ArrayList
any faster than iterated Hashtable
? Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
首先,我建议您使用
HashMap
而不是Hashtable
,同样的原因,ArrayList
是比Vector 更好的选择
:由于无用的同步而导致的开销更少。我的猜测是,迭代 ArrayList 比迭代 Hashtable(或 HashMap)返回的 Set 更快。 /code> 的)
entrySet()
方法。但了解的唯一方法是进行分析。显然,HashMap 的显示列表更改(除了追加或删除最后一个元素之外)比 ArrayList 更快。
编辑
所以我遵循了自己的建议并进行了基准测试。这是我使用的代码:
下面是典型运行的结果:
显然,使用 ArrayList 比 HashMap 取得了巨大的胜利(3-4 倍),至少对于我迭代 HashMap 的风格来说是这样。我怀疑数组迭代器比数组下标慢的原因是所有迭代器对象都需要创建然后进行垃圾收集。
作为参考,这是在具有大量可用内存的 Intel 1.6GHz 四核 Windows 计算机上使用 Java 1.6.0_26(64 位 JVM)完成的。
First, I suggest you use a
HashMap
instead of aHashtable
, for the same reason thatArrayList
is a better choice than aVector
: less overhead due to useless synchronization.My guess is that iterating through an
ArrayList
will be faster than iterating through theSet
returned by aHashtable
's (orHashMap
's)entrySet()
method. But the only way to know is to profile.Obviously, changes to the display list (other than appending or chopping off the last element) are going to be faster for a
HashMap
than for anArrayList
.EDIT
So I followed my own advice and benchmarked. Here's the code I used:
And here are the results for a typical run:
Clearly using an ArrayList is a big win (by a factor of 3-4) over a HashMap, at least for my style of iterating through a HashMap. I suspect the reason the array iterator is slower than array subscripting is all the iterator objects that need to be created and then garbage-collected.
For reference, this was done with Java 1.6.0_26 (64-bit JVM) on an Intel 1.6GHz quad-core Windows machine with plenty of free memory.
我相当确定迭代
ArrayList
会比迭代Hashtable
更快。不过,不确定差异有多大——在实际的内部逻辑中可能是(拇指吸)2 倍,但这并不多。但请注意,除非需要多线程同步,否则应该使用
HashMap
而不是Hashtable
。在那里可以获得一些性能。I'm fairly sure that iterating through the
ArrayList
will be faster than iterating over theHashtable
. Not sure how significant the difference is, though -- maybe (thumb suck) 2x in the actual internal logic, but that's not much.But note that, unless you need multithread synchronization, you should use a
HashMap
rather than aHashtable
. There's some performance to be gained there.实际上,我查看了当前的
HashMap
实现(正如大家指出的那样,优于Hashtable
)。迭代值看起来就像简单地迭代底层数组。因此,速度可能与迭代 ArrayList 相当,尽管可能需要一些时间跳过 HashMap 底层数组中的间隙。
总而言之,分析为王。
Actually, I looked at the current
HashMap
implementation (preferred overHashtable
as everyone points out). Iterating over the values looks like it's simply iterating through an underlying array.So, speed will probably be comparable to iterating an
ArrayList
, though there may be some time skipping over gaps in theHashMap
s underlying array.All said, profiling is king.
A) 不要使用
Hashtable
,使用HashMap
。Hashtable
已被非正式弃用B) 这取决于应用程序。在 HashMap 中查找速度会更快,迭代可能会相同,因为两者都在内部使用数组。 (但是 HashMap 中的数组有间隙,因此这可能会给 ArrayList 带来一些优势)。哦,如果你想保持固定的迭代顺序,请使用
LinkedHashMap
(按插入排序)或TreeMap
(按自然顺序排序)A) don't use
Hashtable
, useHashMap
.Hashtable
is informally deprecatedB) That depends on the application. Lookup will be faster in the
HashMap
, Iteration will likely be the same as both use arrays internally. (but the arrays in aHashMap
have gaps, so that might give a slight advantage to theArrayList
). Oh, and if you want to maintain a fixed order of iteration, useLinkedHashMap
(sorted by insertion) orTreeMap
(sorted by natural ordering)正如已经说过的,最好使用
HashMap
。关于迭代,理论上,ArrayList 必须更快,原因有两个。首先,数据结构更简单,访问时间更少。第二个是 ArrayList 可以通过索引进行迭代,而无需创建 Iterator 对象,在大量使用的情况下,产生的垃圾更少,因此 gc 也更少。在实践中 - 您可能不会注意到差异,这取决于您要使用它的重量。
As already said, it's better to use
HashMap
. Regarding to iteration, in theory,ArrayList
has to be faster for two reasons. First is that data structure is simpler, which gives less access time. The second is thatArrayList
can be iterated by index without creating Iterator object, which, in case of intense use, produce less garbage and therefore less gc.In practice - you may not notice difference, depends how heavy you are going to use it.
如果不需要检索同步,请使用
java.util.HashMap
而不是java.util.Hashtable
。Use
java.util.HashMap
instead ofjava.util.Hashtable
if you don't need retrieval synchronization.