gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:57:25 25 4
gpt4 key购买 nike

我使用 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 返回一个整数?这里似乎有一个错误:https://code.google.com/p/google-web-toolkit/issues/detail?id=2693

最佳答案

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

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

    有几种方法可以将可能是 float 的 JS 数字转换为整数,这样您就可以确定 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在您的链接答案中 - 第一个是按位或,而第二个是 boolean 值或。

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

关于java - 对 JSNI 函数使用 int 或 double 时,性能有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com