GWT: заполнение страницы из хранилища данных с помощью RPC происходит слишком медленно - PullRequest
5 голосов
/ 02 мая 2010

Есть ли способ ускорить заполнение страницы с помощью элементов пользовательского интерфейса GWT, которые генерируются из данных, загруженных из хранилища данных? Могу ли я избежать ненужного вызова RPC при загрузке страницы?

Подробнее о проблеме, с которой я столкнулся: Есть страница, на которой я создаю таблицу с именами и кнопками для списка объектов, загруженных из хранилища данных. Для страницы есть EntryPoint, и в ее onModuleLoad () я делаю что-то вроде этого:

final FlexTable table = new FlexTable();

rpcAsyncService.getAllCandidates(new AsyncCallback<List<Candidate>>() {
    public void onSuccess(List<Candidate> candidates) {
       int row = 0;
       for (Candidate person : candidates) {
          table.setText(row, 0, person.getName());
          table.setWidget(row, 1, new ToggleButton("Yes"));
          table.setWidget(row, 2, new ToggleButton("No"));
          row++;
       }
    }
    ...
});

Это работает, но на загрузку страницы кнопками для 300 кандидатов уходит более 30 секунд. Это недопустимо.

Приложение работает на Google App Engine и использует хранилище данных ядра приложения.

Ответы [ 4 ]

8 голосов
/ 02 мая 2010

Вы могли бы сделать много вещей, я просто перечислю их в порядке, который даст вам лучший эффект.

  1. FlexTable не предназначено для 300 строк. Поскольку ваша таблица очень проста, вы должны подумать о создании HTML вручную, а затем использовать простой виджет HTML. Кроме того, 300 строк - это много информации - рассмотрите возможность использования нумерации страниц. Образец приложения DynaTable показывает, как это сделать.
  2. Похоже, вы используете один модуль GWT на страницу. Это неправильный подход к GWT. Загрузка модуля GWT имеет некоторые нетривиальные затраты. Чтобы понять, что я имею в виду, сравните обновление браузера в gmail v / s со ссылкой обновления, которую предоставляет gmail. Это та же самая цена, которую вы платите, когда каждая страница на вашем сайте имеет отдельный модуль GWT.
  3. Если список кандидатов необходим для разных представлений, вы можете отправить его вместе с HTML в виде объекта JSON, а затем использовать Словарь класса в GWT для его чтения. Это спасает вас от вызова RPC, который вы делаете. Этот подход рекомендуется только в том случае, если данные будут полезны для нескольких представлений / экранов (например, для входа в информацию пользователей)
  4. Проверьте, сколько времени занимает вызов метода RPC. Вы можете включить stats в GWT , чтобы выяснить, где ваше приложение требует времени.
  5. Вы также можете запустить Speed ​​Tracer , чтобы определить узкое место. Это последнее только потому, что очевидно, что FlexTable выполняет много манипуляций с DOM. В общем, если вы не знаете, с чего начать, Speed ​​Tracer - отличный инструмент.
1 голос
/ 03 мая 2010

Ваша проблема в том, что каждый раз, когда вы добавляете что-то в FlexTable, он должен перерисовывать всю страницу и перерисовывать.Попробуйте создать новый FlexTable, заполнить его, когда он будет заполнен полностью, избавиться от старого и поместить туда новый.

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

Как и Шри предложил - разбиение на страницы является самым простым и (я думаю) лучшим решением (наряду с переключением на Grid или просто <table>). Но если вы по какой-то причине хотели показать / отобразить много строк одновременно, проект GWT имеет прекрасную вики-страницу об этом - вместе с некоторыми тестами, показывающими, как FlexTable отстой при большом количестве строк Проверьте их другие таблицы тоже;)

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

Важным здесь является то, как вы получаете список кандидатов, который вы не показали. 30 секунд - это чрезвычайно много, и вряд ли это связано с одним хранилищем данных.

Вы пытались использовать appstats для профилирования своего приложения?

...