Эффективное представление для больших числовых массивов в GWT - PullRequest
2 голосов
/ 27 июня 2009

У меня есть класс временных рядов, который в течение дня будет содержать значения от 100К до 200К (в основном рыночные тики, с одинаковой выборкой). На стороне Java наиболее производительным представлением является использование double [] (в отличие от, скажем, List). Я сомневаюсь, что этот подход хорошо отображается в javasctipt.

На стороне Java массив double [] должен периодически увеличиваться (т.е. выделять новый массив и копировать старый в новый). Так, например, у класса есть метод вроде:

public void add (long time, double price)
{
    ...
    if (_len == _prices.length)
        expand ();

    _prices[_len++] = price;
    ...
}

private void expand ()
{
    final double[] newprices = new double [_prices.length + 1024];
    System.arraycopy (_prices, 0, newprices, 0, _len);
    _prices = newprices;
}

Теперь javascript имеет другую модель массива и позволяет инкрементное расширение за счет индексации за пределами последнего индекса, неявно корректируя распределение.

GWT имеет JsArrayNumeric, который позволяет видеть и манипулировать числовыми массивами JS. JsArrayNative, как предполагается, является возвращаемой подписью от JS, хотя и не может быть реализован (да, это может привести к некоторому условному использованию JSNI на стороне JS, но безобразно).

Вопрос, в GWT, какие структуры данных я могу использовать в классе Java, чтобы получить наилучшее отображение в представление JS? Я ищу наиболее эффективный подход для:

  • добавление цены к временным сериям (увеличение временных рядов)
  • доступ к временным сериям (часто сканирует часть по индексу) / li>

ArrayList , например, отображается на что-то плотное в JavaScript? Может быть, это лучшее отображение, чем при использовании raw double [].

Ответы [ 3 ]

1 голос
/ 28 июня 2009

Я не смотрел на скомпилированный вывод класса ArrayList, но я не думаю, что вы увидите какое-либо преимущество с точки зрения сырой производительности ArrayList по сравнению с double []. Тем не менее, я бы предложил использовать ArrayList, если вы не профилировали и не знаете, что методы add или get на самом деле являются узкими местами приложения. Если это не узкое место, то у вас меньше кода для записи, так как вы можете использовать ArrayList.

Потратьте некоторое время на профилирование вашего приложения, прежде чем пытаться оптимизировать структуры данных. Firebug прекрасно работает, но простые старые вызовы синхронизации методов работают также хорошо, чтобы получить приблизительное представление о том, где приложение тратит свое время. Если вы используете firebug, убедитесь, что вы скомпилировали довольно или подробно, чтобы иметь смысл в выводе.

Вы намекали на это, но я подчеркну, что не нужно профилировать в размещенном режиме, поскольку JVM имеет все виды оптимизаций, которые сильно отличаются от движков Javascript в различных браузерах. Стоит также указать на этот вопрос о потоке стека , поскольку в нем обсуждается одна из наиболее распространенных проблем производительности GWT, с которыми я сталкивался в моих собственных приложениях, которые выполняют довольно сложную обработку данных на клиенте. Я знаю, что это не доказательство, но мы еще не столкнулись с какими-либо проблемами, у которых ArrayList был узким местом.

Наконец, конференция Google IO провела несколько выступлений, в которых содержалась интересная информация о производительности.

http://www.youtube.com/watch?v=q9hhENmVTWg http://www.youtube.com/watch?v=hNEvr2eLad0
1 голос
/ 03 июля 2009

JSArrayNumber даст вам наиболее эффективное отображение. ArrayList будет упаковывать значения для вас, что будет означать обертку объекта для каждого значения. Даже double [] будет соблюдать семантику начальных значений Java (гарантируя, что каждый элемент инициализируется в 0.0). JSArrayNumber будет отображаться непосредственно в массив JavaScript, содержащий примитивные числа.

Здесь есть некоторые атрибуты, так как массивы JavaScript могут возвращать undefined для неинициализированных индексов, а назначение индекса может фактически изменить длину. Вы должны будете принять это во внимание. Я обычно создаю подкласс JsArrayNumber и использую утверждения для проверки использования.

Кроме того, вам не нужно использовать JSNI для создания экземпляра JsArrayNumber:

JSArrayNumber a = JavaSriptObject.createArray().cast();
1 голос
/ 27 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...