在为JSNI函数使用int或double时,它对性能有什么影响?

时间:2014-04-18 13:42:04

标签: java javascript html gwt jsni

我使用GWT JSNI来访问本机JavaScript库。

我想知道我通过JSNI传递的数据速度是否有任何不同。

示例1:

public static native int test(int value) /*-{
  return this.computeSomething(value);
}-*/;

示例2:

public static native double test(double value) /*-{
  return this.computeSomething(value);
}-*/;

假设computeSomething()将整数值作为参数并返回整数值。

  1. 我是否必须按照此处的建议投出返回值:How to work with int values in gwt jsni methods

  2. 在为JSNI函数使用int或double时,它对性能有什么影响吗?

  3. 有没有办法从JSNI返回一个int?这里似乎有一个错误:https://code.google.com/p/google-web-toolkit/issues/detail?id=2693

1 个答案:

答案 0 :(得分:2)

当您从Java调用JS时,编译器信任JSNI代码完全遵循方法签名。这意味着如果从double方法返回int值,您可能会在其他位置获得其他效果。这产生以下结果:

  1. 如果您不相信JS代码返回正确的类型,则需要进行强制转换。例如,如果方法声明了一个int,但是js代码可能返回一个double,那么你应该强制转换为int。您链接的问题更多的是关于返回null而不是数字。
  2. 就性能而言,它完全没有区别。由于GWT假设JS会按照你说的那样做,它不会做任何额外的工作来验证(除了在开发模式下,作为验证代码有意义的方法)

    有几种方法可以从JS Number转换为可能是浮点数的整数,这样您就可以确定GWT / Java代码可以接受它。第一种是简单地返回double,然后在您的Java代码中,转换为int,或使用Math.round删除任何不需要的精度。另一个是在你的JSNI中做com.google.gwt.dom.client.Element#toInt32与GWT 2.6相同的事情:

    /**
     * Fast helper method to convert small doubles to 32-bit int.
     *
     * <p>Note: you should be aware that this uses JavaScript rounding and thus
     * does NOT provide the same semantics as <code>int b = (int) someDouble;</code>.
     * In particular, if x is outside the range [-2^31,2^31), then toInt32(x) would return a value
     * equivalent to x modulo 2^32, whereas (int) x would evaluate to either MIN_INT or MAX_INT.
     */
    private static native int toInt32(double val) /*-{
      return val | 0;
    }-*/;
    

    请注意在您的链接答案中使用| 0|| 0 - 第一个是按位OR,而第二个是布尔值。

  3. 从JSNI返回int没有问题 - 链接的问题是关于返回java.lang.Integerint周围的盒装Java类型。这个问题存在缺陷,因为JsArray<Integer>已经存在com.google.gwt.core.client.JsArrayNumber,因此不需要{{1}},你只需要转换为int来处理舍入问题。