Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带有Swing组件的RMI代理时性能不佳_Java_Performance_Rmi - Fatal编程技术网

Java 使用带有Swing组件的RMI代理时性能不佳

Java 使用带有Swing组件的RMI代理时性能不佳,java,performance,rmi,Java,Performance,Rmi,当我向JavaSwingJList组件添加RMI代理引用时,我遇到了巨大的性能问题 我正在从服务器检索带有RMI的用户Profiles列表。检索本身只需要一秒钟左右,因此在这种情况下这是可以接受的。但是,当我试图在自定义ListModel和CellRenderer的帮助下,将这些代理添加到JList时,添加大约180个对象需要30-60秒。因为它是一个用户名列表,所以最好按字母顺序显示 最大的性能损失是在元素添加到ListModel时对其进行排序。由于列表总是被排序的,我选择使用内置的Colle

当我向JavaSwingJList组件添加RMI代理引用时,我遇到了巨大的性能问题

我正在从服务器检索带有RMI的用户
Profile
s列表。检索本身只需要一秒钟左右,因此在这种情况下这是可以接受的。但是,当我试图在自定义
ListModel
CellRenderer
的帮助下,将这些代理添加到
JList
时,添加大约180个对象需要30-60秒。因为它是一个用户名列表,所以最好按字母顺序显示

最大的性能损失是在元素添加到ListModel时对其进行排序。由于列表总是被排序的,我选择使用内置的
Collections.binarySearch()
为下一个要添加的元素找到正确的位置,比较器使用
Profile
接口定义的两种方法,即
getFirstName()
getLastName()

有没有办法加快这个过程,或者我只是用错误的方式来实现它?或者这是RMI的一个“特征”?我非常希望能够在本地缓存远程对象的一些数据,以最小化远程方法调用



更新和可能的解决方案:我创建了实现远程接口并包含远程对象引用的本地类。速度的提高是显而易见的,现在它的效果很好(至少到目前为止)。我希望这同样适用于我们在应用程序中使用的其他接口。感谢我认为有助于指导我的输入。

我认为您需要将显示字段添加到配置文件对象中,并将其与配置文件一起返回。可以在单个inspector视图中返回整个概要文件,但是如果在概览视图中有它们,则应在初始查询中返回它们。

(a)这与RMI无关


(b) 摆弄binarySearch()只会浪费时间。使用Collections.Sort()首先或最后对项进行排序,或将树模型基于本质上已排序的集合

Patrick,你正在调用
Collections.binarySearch
Remote
对象进行搜索吗?如果此方法必须向rmi服务器询问有关对象的更多信息,则可能是您无意中造成了网络上的大量流量。

不确定显示字段和检查器视图的确切含义。Profile类定义了firstName和lastName属性。对象本身通过Hibernate映射到数据库。进行一次调用以获取不同的配置文件,而不是多次调用。这会有帮助的。关键是你还可以缓存firstName和lastName,对吗?否则,我会惊讶于它的帮助。无论我采取哪种方式,无论是在将集合添加到ListModel之前对集合进行预排序,还是在ListModel中使用排序后的集合,性能都相当差。我猜这与comparator有关,comparator会进行两次RMI调用来检索配置文件的名字和姓氏。您应该缓存它们,它们在排序或binarySearch()过程中会经常被调用。