У меня есть TreeViewer, он отображает список элементов. Мои ограничения следующие:
- Каждый элемент представлен в виде XML-файла на диске.
- Имя файла каждого XML-файла является меткой для значка («hello.xml» -> элемент «привет» в дереве)
- Каждый файл XML имеет «тип», хранящийся в XML, это представляет изображение для каждого элемента
Когда я выполняю getChildren () для элементов TreeViewer, я читаю в каждом файле XML и генерирую оттуда массив Object []. До недавнего времени это было приемлемо, но это больше не так. Нормальное количество файлов XML было 10, теперь оно 500.
Мне нужно улучшить производительность. Однако по ряду причин, таких как совместимость, следующие опции невозможны
- Невозможно изменить формат файлов XML (т. Е. Использовать базу данных, сериализованный объект ..)
- Невозможно создать дополнительное представление файлов XML
- Невозможно изменить имя XML-файлов (например, hello.xml -> hello-type.xml '
Исходя из моих тестов, разумная производительность обнаруживается при получении списка каталогов XML-файлов и использовании его для меток. Название метки является наиболее важным аспектом, и хотя тип изображения полезен, его наличие не требуется немедленно.
Эти требования и ограничения привели меня к следующему решению:
- Первоначально getChilren () сканирует каталог файлов XML и возвращает список меток с изображением «отсутствующего» типа. (getImage () = missingImage)
- getChilren () затем запускает фоновое задание, которое читает файлы XML и получает тип.
- Каждый объект [] имеет метод cacheImage (), который загружается в изображение типа (поэтому теперь getImage () == ProperIcon). Это называется Иов.
- Затем Job выполняет итерацию по каждому элементу дерева и вызывает update () для каждого элемента
Я реализовал это, и производительность оставляет желать лучшего. Кроме того, поскольку у нас так много вызовов Display.getDefault (). AsyncExec, чтобы выполнить обновление, GUI (хотя и остается отзывчивым) потребует времени, чтобы ответить на взаимодействия с пользователем (хотя фактически не блокируется). Есть ли способы, которыми я могу улучшить это?
Было рассмотрено / опробовано следующее:
- Использовать DeferredTreeContentManager - не сделал этого, потому что сначала я хочу быстро и быстро получить имена, изображения могут последовать позже в своем собственном темпе
- Выполнение обновления () для всех элементов одновременно / пакетирование элементов - это блокирует графический интерфейс, что хуже, чем для многих отдельных обновлений ()