【问题标题】:GWT internal representation of byte[]byte[] 的 GWT 内部表示
【发布时间】:2014-07-13 08:41:52
【问题描述】:

我正在开发一个 GWT 项目,我们偶尔会使用 JSNI 来调用原生 JavaScript 代码。性能瓶颈似乎是在 Java 代码和 JavaScript 代码之间来回传递值。具体来说,无法将 byte[] 从 Java 端传递到 JS 代码中,反之亦然——只能传递 int、byte、String 等,但不能传递 byte[]。这意味着我们必须在调用之前将数组转换为字符串,然后再转换回字节数组表示(byte[] 或 UInt8Array)。这似乎没有必要,因为 GWT 的 byte[] 必须有一些原生 JavaScript 表示。有谁知道 GWT 如何表示字节数组?更改 GWT 编译器以允许我们直接访问数组可能是一种选择。

【问题讨论】:

  • JavaScript 没有 byte[] 的原生概念。虽然我不确定 GWT 转换是什么,但研究(例如搜索)Typed Arrays 可能是值得的。
  • 我知道没有原生的 byte[] 概念。但由于 GWT 程序可以使用 byte[]'s 并转换为 JavaScript,GWT 必须有一些 byte[]'s 的 JavaScript 表示,我只是想知道它是什么。它是类型化数组、字符串、数字数组还是...?
  • 检查生成的代码?这对于特定场景来说是确定的。

标签: arrays gwt byte jsni


【解决方案1】:

几乎所有数字类型,包括byte,都表示为JavaScript 数字(盒装类型和long 除外)。编译器会根据需要插入范围检查或“溢出”以正确模拟预期的 Java 行为。

从 GWT 2.6.x(和当前的 GWT 主干)开始,任何原始数字数组在编译时都被实现为 JavaScript 数组。但是,在开发模式下运行时,会使用原生 Java 数组,因此您不能编写简单地将 Java 数组传递给 JavaScript 的 JSNI 代码,并期望它正确运行。见http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#sharing

Java 数组

只能传递回 Java 代码的不透明值

即使不考虑开发模式,也要小心处理 Java 数组,就像它是 JavaScript 数组一样 - 任何未来的编译器优化都会发出类型化数组(正如您在问题中提到的那样)可能会意外地破坏您的代码。

也就是说,有一些方法可以在您的 Gwt/Java 代码中创建 JavaScript 数组 TypedArrays,以便您可以在 JavaScript 中使用它们。使用 JsArrayNumber 类型来保存双对象(回想一下,JS 'Numbers' 实际上是 Java double),或者使用 com.google.gwt.typedarrays.shared.Uint8Array 类和 typedarrays 包的其余部分来处理 Java 中的类型化数组。

就更改编译器而言,我在去年年底提交了一个试图添加此功能的补丁 (https://gwt-review.googlesource.com/4260)。有两个主要因素阻止了这个想法:

  • 首先,数组编译发生了其他变化,在一个月左右的时间内多次破坏了我的补丁。这些更改改进了一般对象数组,因此是有益的,而且我认为我的补丁最终无法正常工作。不过……
  • 补丁将所有原始数组(long 除外,因为 JS 中没有 64 位 int 类型数组)改为基于 ArrayBuffer。有点自相矛盾的是,这在许多情况下引入了性能回归,因为现在任何小数组都必须作为类型化数组分配,而当时在大多数/所有浏览器中这比实际创建典型的 JS 数组要慢目的。已经讨论了几个想法来处理这个问题 - 一个标志来全局打开/关闭这个特性,一个注释来声明一个实例将是一个类型化数组,一个特殊的 TypedJavaArrays 工厂类来创建原始 Java 数组,这些数组由JS TypedArrays(因此任何性能问题都取决于用户)等等。

在时间允许的情况下,我仍在追求这一点,并且不能确定它是否会发布 GWT 2.7 或更高版本 - 我们不想为了某些特殊情况而减慢所有 GWT 代码无论如何都可以参考typedarrays包。

【讨论】:

  • 感谢您的详尽回复,非常感谢。我希望你的补丁有一天会成功:-)
猜你喜欢
  • 2019-06-04
  • 1970-01-01
  • 2018-03-27
  • 2021-05-28
  • 2019-03-20
  • 2019-01-20
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多