当为JSNI函数使用int或double时,它在性能上有什么不同吗

Does it make any difference in Performance when using int or double for JSNI Functions?

本文关键字:性能 什么 函数 JSNI int double 当为      更新时间:2023-09-26

我使用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. 我必须按照这里的建议强制转换返回值吗:如何在gwt-jsni方法中使用int值

  2. 对JSNI函数使用int或double时,性能会有什么不同吗?

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

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

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

    有几种方法可以从可能是浮点的JS数字转换为整数,这样您就可以确信GWT/Java代码可以接受它。第一种方法是简单地返回double,然后在Java代码中转换为int,或者使用Math.round来删除任何不需要的精度。另一个是在您的JSNI中做com.google.gwt.dom.client.Element#toInt32在GWT2.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,而第二个是布尔OR。

  3. 从JSNI返回int没有问题——链接的问题是返回java.lang.Integer,即围绕int的盒装Java类型。这个问题是有缺陷的,因为com.google.gwt.core.client.JsArrayNumber已经存在,所以不需要JsArray<Integer>,您只需要强制转换为int就可以处理舍入问题。