Низкая производительность при использовании RMI-прокси с компонентами Swing - PullRequest
2 голосов
/ 18 мая 2010

У меня возникают огромные проблемы с производительностью, когда я добавляю ссылки RMI-прокси на JList-компонент Java Swing.

Я получаю список пользователей Profile с RMI с сервера. Сам поиск занимает всего секунду или около того, так что это приемлемо в данных обстоятельствах. Однако, когда я пытаюсь добавить эти прокси в JList с помощью пользовательских ListModel и CellRenderer, для добавления около 180 объектов требуется от 30 до 60 секунд. Поскольку это список имен пользователей, желательно представлять их в алфавитном порядке.

Наибольшее снижение производительности происходит, когда я сортирую элементы по мере их добавления в ListModel. Поскольку список всегда будет отсортирован, я решил использовать встроенную Collections.binarySearch(), чтобы найти правильную позицию для следующего добавляемого элемента, а компаратор использует два метода, которые определяются интерфейсом Profile, а именно getFirstName() и getLastName().

Есть ли способ ускорить этот процесс, или я просто неправильно его реализую? Или это «особенность» RMI? Я бы очень хотел иметь возможность кэшировать некоторые данные удаленных объектов локально, чтобы минимизировать вызовы удаленных методов.


Обновление и возможное решение: Я создал локальные классы, которые реализуют удаленные интерфейсы и содержат ссылку на удаленные объекты. Повышение скорости заметно, и теперь оно работает без всяких проблем (по крайней мере, пока). Я надеюсь, что это работает так же хорошо для других интерфейсов, которые мы используем в нашем приложении. Спасибо за вклад, который, как мне кажется, помог мне.

Ответы [ 3 ]

1 голос
/ 18 мая 2010

Патрик, вы звоните Collections.binarySearch на Remote объектах? Может случиться так, что вы непреднамеренно создаете огромный объем трафика в сети, если этот метод должен запросить у сервера rmi дополнительную информацию об объектах.

1 голос
/ 18 мая 2010

Я думаю, что вам нужно добавить поля отображения в ваш объект профиля и вернуть их вместе с профилем. Можно вернуть весь профиль в одном виде инспектора, но если они есть в обзорном виде, вы должны вернуть их в исходном запросе.

0 голосов
/ 18 мая 2010

(a) Это не имеет ничего общего с RMI.

(b) Разбираться с двоичным поиском () - это просто трата времени. Сортируйте элементы первым или последним с Collections.sort () или основывайте TreeModel на коллекции, отсортированной по сути.

...