我在JSF1.2和Richfaces 3.3.2中构建了一个树分页,因为我有很多树节点(类似于80k),而且速度很慢..
因此,作为第一次尝试,我使用页面和页面的节点列表创建一个HashMap。
但是,表现不够好......
所以我想知道是否比HashMap更快,可能是列表或其他东西。
有人对此有一些经验吗?我该怎么办?
提前致谢。
EDIT。
最大的问题是我必须在树的子节点中验证用户的权限。我知道这是一个大问题:这个验证很慢,因为我必须进入节点,我没有一个好方法来知道用户是否在10级节点中拥有权限而没有迭代所有节点。除此之外,同样的三个用于更多的地方...... 我为什么要这样做的基本原因是客户端会慢很多,因为richfaces生成的结构,很多tr和td,浏览器对此很疯狂。 所以,不幸的是,我必须加载所有节点,并且只对客户端进行分页,我需要知道它们的迭代速度更快......
抱歉我的英文不好。
答案 0 :(得分:8)
如果要获取页面的所有节点,哈希映射是最快的数据结构。节点列表可以在恒定时间(O(1))中获取,而列表时间为O(n)(n =页面数,在排序列表上更快但从未接近O(1))
数据结构上的操作太慢。这是您在开始优化之前必须分析的内容。
答案 1 :(得分:2)
这可能更多是由于JSF是性能猪而不是数据结构选择。我已经看到创建一个JSF应用程序的一次尝试可以用日..时间。
在没有更多关于根本原因的知识的情况下猜测解决方案,你犯了一个错误。我建议您对自己的应用进行分析,以了解花费的时间。
答案 2 :(得分:2)
要使用的数据结构始终取决于您需要如何存储数据以及如何访问它。假设密钥,HashMap<K, V>
应该在访问值时具有恒定的时间复杂度。当您致电get(key)
时,会计算hashCode()
key
,并用它来检索相关值。除非你有不同的密钥具有相同的哈希码(在这种情况下你可能做错了,因为虽然不是强制性的,但不同的对象应该有不同的哈希码,至少在大多数情况下),这通常很快
搜索普通列表中的元素需要扫描列表,这几乎总是比计算哈希码慢。
如果您需要将值与键相关联,则可以使用Map
。并且HashMap
应该足够快。
我对JSF知之甚少,但我认为 - 如果数据结构和访问模式是Map
设计的那个 - 问题不在于HashMap
本身。
答案 3 :(得分:-1)
我会用一个获取子节点的javascript / ajax调用方法来解决这个问题。