我有一个timeseries类,在一天的过程中,它将保存100 K-200 K的值(基本上是市场滴答,均匀抽样)。在java方面,最具表现力的表现形式是使用双与之相反的是。我怀疑这种方法能否很好地映射到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的返回签名,但不能被实例化(是的,可以在JS端产生一些有条件的JSNI使用,但很难看)。
问题是,在GWT中,我可以在java类中使用什么数据结构来获得到JS表示的最佳映射?我在寻找最有表现力的方法:
例如,ArrayList是否映射到javascript中的紧密内容?这可能有一个更好的映射,使用原始double[]。
发布于 2009-07-03 02:56:42
JSArrayNumber将为您提供最有效的映射。ArrayList将为您指定值,这意味着每个值都有一个对象包装器。即使是double[]也将遵守Java初始值语义(确保将每个元素初始化为0.0)。JSArrayNumber将直接映射到保存原语数字的JavaScript数组上。
这里有一些标记,因为JavaScript数组可以为未初始化的索引返回未定义的值,而分配给索引实际上可以更改长度。你得把这些考虑进去。我通常创建JsArrayNumber的子类并使用断言来验证use。
此外,您不必使用JSNI来实例化JsArrayNumber:
JSArrayNumber a = JavaSriptObject.createArray().cast();发布于 2009-06-27 18:42:14
我会担心把这么多数据送到浏览器并在那里进行处理。如果我在GWT应用程序中有数十万个数据点要处理,我会尝试完成大部分处理服务器端的操作,只需将简化的数据视图发送给浏览器以显示给用户。
发布于 2009-06-28 05:14:49
我还没有看过ArrayList类的编译输出,但我认为您不会看到ArrayList对double[]的原始性能有什么好处。尽管如此,我建议使用ArrayList,除非您已经分析过并且知道add或get方法实际上是应用程序的瓶颈。如果这不是瓶颈,那么您可以使用ArrayList编写更少的代码。
在尝试优化数据结构之前,请花一些时间分析您的应用程序。Firebug很好用,但是简单的老方法计时调用也能很好地理解应用程序花费时间的地方。如果使用firebug,请确保编译得很漂亮或详细,这样才能理解输出。
您已经暗示过了,但我要强调的是,不要在托管模式下进行概要分析,因为JVM具有与不同浏览器中的Javascript引擎大不相同的各种优化。还值得指出的是,这个堆叠溢出问题讨论了我在自己的应用程序中看到的更常见的GWT性能问题之一,这些应用程序在客户机上进行了相当繁重的数据处理。传闻证据,我知道,但我们还没有遇到任何问题,以ArrayList为瓶颈。
最后,Google会议举行了几次会谈,讨论了一些有趣的性能信息。
https://stackoverflow.com/questions/1053256
复制相似问题