Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 字节[]的GWT内部表示形式_Arrays_Gwt_Byte_Jsni - Fatal编程技术网

Arrays 字节[]的GWT内部表示形式

Arrays 字节[]的GWT内部表示形式,arrays,gwt,byte,jsni,Arrays,Gwt,Byte,Jsni,我正在从事一个GWT项目,在这个项目中,我们偶尔使用JSNI调用本机JavaScript代码。性能瓶颈似乎是Java代码和JavaScript代码之间来回传递值。具体来说,无法将字节[]从Java端传递到JS代码中,反之亦然——只能传递int、byte、String等,而不能传递字节[]。这意味着我们必须在调用之前将数组转换为字符串,然后再转换回字节数组表示形式(byte[]或UInt8Array)。这似乎没有必要,因为GWT的字节[]必须具有一些本机JavaScript表示。有人知道GWT是如

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

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

从GWT2.6.x(以及当前的GWT主干)开始,任何原语数字数组在编译时都实现为JavaScript数组。但是,在开发模式下运行时,会使用本机Java数组,因此您无法编写简单地将Java数组传递给JavaScript的JSNI代码,并期望它能够正常工作。见:

Java数组

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

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

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

至于修改编译器,我在去年年底提交了一个补丁(),试图添加这个功能。有两件事阻碍了这一想法的实现:

  • 首先也是最重要的是,数组编译发生了其他变化,在一个月左右的时间里多次破坏了我的补丁。这些改变改善了一般的对象阵列,因此是有益的,我认为没有理由我的补丁最终不能工作。然而
  • 修补程序将所有基本数组(除了
    long
    ,因为JS中没有64位int-typedarray)更改为基于
    ArrayBuffer
    。有些矛盾的是,在许多情况下,这会导致性能下降,因为现在任何小数组都必须作为类型化数组分配,而在当时,大多数/所有浏览器中,这比实际创建典型的JS数组对象要慢。为了解决这个问题,已经讨论了几种方法——一个全局打开/打开此功能的标志,一个声明实例将是类型化数组的注释,一个特殊的
    TypedJavaArrays
    factory类来创建由JS TypedArrays支持的原始Java数组(因此任何性能问题都取决于用户),等等

随着时间的推移,我仍在追求这一点,并且不能确定它是否会成为GWT 2.7或更高版本-我们不想为了一些特殊情况而减慢所有GWT代码的速度,这些特殊情况可以引用
typedarrays
包。

JavaScript没有
字节[]
的原生概念。虽然我不确定GWT转换是什么,但研究(如搜索)可能是值得的。我知道字节[]没有原生概念。但是由于GWT程序可以使用字节[]并转换为JavaScript,所以GWT必须具有字节[]的JavaScript表示形式,我只是想知道它是什么。它是类型化数组、字符串、数字数组还是…?检查生成的代码?这将是特定场景的最终结果。感谢您的全面回复,非常感谢。我希望有一天你的补丁会成功:-)