GWT:如何避免在生成的JavaScript代码中调用dynamicCast和canCastUnsafe?

2023-11-23

我正在用 Java 编写一些特殊用途的数据结构,旨在在浏览器中使用(使用 GWT 编译为 JavaScript)。

我正在尝试匹配一些内置 JDK 类的性能,我注意到运行速度相当快,但是当我将我的代码跟踪与一些模拟的 JDK 代码进行比较时,我的有很多对dynamicCast 和 canCastUnsafe 的调用,而 JDK 模拟类则不然。这也几乎解释了性能的差异......

有 GWT 专家知道如何避免这种情况吗?这相当于 20% 的开销:-(

Details:

以下是将 10,000 次随机整数(0 到 100,000 之间)插入到两个不同的数据结构中的配置文件输出(在 Firebug 中捕获):

Google 的 java.util.TreeMap 的 TreeMap 实现(红黑树):

Profile (4058.602ms, 687545 calls)
Function              Calls      Percent   Own Time
$insert_1             129809     41.87%    1699.367ms
$compare_0            120290     16%        649.209ms
$isRed                231166     13.33%     540.838ms
compareTo_0           120290      8.96%     363.531ms
$put_2                 10000      6.02%     244.493ms
wrapArray              10000      3.46%     140.478ms
createFromSeed         10000      2.91%     118.038ms
$TreeMap$Node          10000      2.38%      96.706ms   
initDim                10000      1.92%      77.735ms   
initValues             10000      1.49%      60.319ms   
$rotateSingle           5990      0.73%      29.55ms  
TreeMap$Node           10000      0.47%      18.92ms 

我的代码(AVL树):

Profile (5397.686ms, 898603 calls)
Function              Calls      Percent   Own Time
$insert               120899     25.06%    1352.827ms
$compare              120899     17.94%      968.17ms
dynamicCast           120899     14.12%     762.307ms <--------
$balanceTree          120418     13.64%     736.096ms
$setHeight            126764      8.93%     482.018ms
compareTo_0           120899      7.76%     418.716ms
canCastUnsafe         120899      6.99%     377.518ms <--------
$put                   10000      2.59%     139.936ms
$AVLTreeMap$Node        9519      1.04%      56.403ms   
$moveLeft               2367      0.36%      19.602ms   
AVLTreeMap$State        9999      0.36%      19.429ms   
$moveRight              2378      0.34%      18.295ms   
AVLTreeMap$Node         9519      0.34%      18.252ms   
$swingRight             1605      0.26%      14.261ms   
$swingLeft              1539      0.26%      13.856ms

附加观察结果:

  • 我制作的另一个数据结构(SkipList)也有同样的问题。
  • 比较函数中应用了dynamicCast:

    cmp =dynamicCast(right.key, 4).compareTo$(key);

  • 如果类没有实现 Map,dynamicCast 就会消失(即:只需从类中删除“implements Map”。无论是通过接口还是直接访问它都没有关系。这会导致同一行编译为:

    cmp = right.key.compareTo$(key);

这是 SkipList 中 Java 源代码的相关部分:

private int compare(Node a, Object o) {
    if (comparator != null)
        return comparator.compare((K) a.key, (K) o);

    return ((Comparable<K>) a.key).compareTo((K) o);
}

public V get(Object k) {
    K key = (K) k;
    Node<K, V> current = head;

    for (int i = head.height - 1; i >= 0; i--) {
        Node<K, V> right;

        while ((right = current.right[i]) != null) {
            int cmp = compare(right, key);

            ...
        }
    }
}

不幸的是,我仍然不太清楚原因,但根据我的经验,这似乎来自明确的强制转换,例如:

((Comparable) obj).compareTo(other)

生成的 Javascript 如下所示:

dynamicCast(obj, 1).compareTo(other);

其中 1 是生成的 typeId,表示强制转换的目标。 DynamicCast 依次调用 canCastUnsafe,如果为 false,则会抛出 ClassCastException。其价值已debated,因为这已经在托管模式下被捕获。

可以用 JSNI 来回避它:

public static native int compare(Object a, Object b) /*-{
    return a.@java.lang.Comparable::compareTo(Ljava/lang/Object;)(b); 
}-*/;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GWT:如何避免在生成的JavaScript代码中调用dynamicCast和canCastUnsafe? 的相关文章

  • GWT 计时器取消不起作用

    我正在尝试编写代码来使用 GET 和 GETQuery 区分单击和双击 我明白了here http jsfiddle net KpCwN 4 所以我将它翻译成 GWT 如下所示 我的应用程序不能有全局变量 所以我用元素属性来完成该部分 im
  • GWT-出口商。工作示例

    我有一个 Java 库 我需要将其转换为 JS 我找到了解决方案GWT 创建实用的 javascript 库 https stackoverflow com questions 3125556 gwt to create utility j
  • Spring security 已登录用户的重定向问题

    在使用我的基于 GWT 的 Web 应用程序实现 Spring Security 时 我找到 一切都按预期正常工作 除了以下事实 我打开了 login jsp 并给出了有效的用户登录凭据 提交后 成功重定向到主页 现在 当我在地址栏中编辑
  • 从 gwt 中的代码触发点击事件

    我在 gwt 中创建了一个自定义小部件 它扩展了复合材料 我正在其中使用焦点面板 对于 FocusPanel 我添加了 ClickHandler 然后我添加了键盘监听器 现在按 Enter 键 它应该触发单击事件 任何人都可以提供帮助吗 我
  • 在 Java 中如何将类作为参数传递?

    有什么方法可以将类作为 Java 中的参数传递并从该类中触发一些方法吗 void main callClass that class void callClass classObject classObject somefunction o
  • GWT:对RichTextArea进行文本限制并阻止用户输入更多字符

    我正在使用 GWT RixhText Area 并希望在 richText Area 中限制 100 个字符 现在我正在做这个 description addKeyDownHandler new KeyDownHandler Overrid
  • GWT:在另一个模块内调用RPC服务

    我有一个模块B 它继承了模块A 当我从A内部调用RPC服务时 它们工作正常 但是当我在B中调用A的服务时 RPC调用总是失败 我错过了什么吗 预先感谢您的任何帮助 我在这里找到了我的问题的答案 http blog cloudglow com
  • 如何在 GWT 中取消转义字符串

    我使用了 SafeHtmlUtils htmlEscape text 并且我想使用相反的功能 你能告诉我 gwt 中是否有像 unescapeHtml 这样的函数 如果 并且仅当 您可以相信文本不包含恶意内容 您可以使用 import co
  • SMARTGWT 数据源 (GWT-RPC-DATASource) LISTGRID

    我在使用 smartGWT 绑定 ListGrid 中的数据源时遇到问题 我有 GWT RPC DataSource 并将其设置为我的数据源 grid setDataSource ds 单击一键 我的数据源发生了一些更改 我正在生成新的数据
  • 如何使用 Ant 配置惰性或增量构建?

    Java编译器提供增量构建 所以javac蚂蚁任务也是如此 但大多数其他进程则不然 考虑到构建过程 它们将一组文件 源 转换为另一组文件 目标 我在这里可以区分两种情况 变压器cannot获取源文件的子集 仅获取整个集合 这里我们只能做懒惰
  • Vaadin - GWT 错误“模块 xxx 可能需要重新编译

    我正在加大 Vaadin 的力度 每当我尝试运行演示应用程序时 都会收到此 javascript 警报 GWT module com vaadin terminal gwt DefaultWidgetSet may need to be r
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 如何清除gwt中的缓存?

    我怎样才能清除缓存gwt 或者有什么方法可以阻止浏览器保留缓存gwt 当您部署 GWT 应用程序时 避免代理和浏览器缓存 GWT 生成的 nocache js 文件非常重要 一种解决方案是实现一个 Servlet 过滤器 添加控制缓存行为的
  • gwt 谷歌应用引擎 HTTP 错误 404

    我在 Eclipse 中使用 google 应用程序引擎创建了一个新的 gwt 项目 但是当我运行该项目时 在浏览器中我收到以下消息 HTTP 错误 404 访问 Test html 时出现问题 原因 NOT FOUND 由码头提供动力 现
  • GWT 和 Web 服务 (wsdl)

    谁能告诉我一种从 GWT 客户端访问 WSDL Web 服务的方法 这可能吗 Thanks 智能网关 http www smartclient com product index jsp支持 WSDL 数据源 除此之外 您始终可以将 WSD
  • 根据外形尺寸更改入口点类别

    如果用户从移动 Web 浏览器或桌面 Web 浏览器访问 我希望在我的 GWT 应用程序中加载不同的用户界面 我想知道如何编辑我的 Application gwt xml 文件 更改根据外形规格加载哪个入口点类 我认为这可能是这样的 但我只
  • gwt 中的垂直居中

    如何使用垂直面板在 gwt 中垂直居中 或者请告诉我有什么方法可以进行垂直居中 如果你想直接使用VerticalPanel从代码中 您需要使用setVerticalAlignment HasVerticalAlignment ALIGN M
  • GWT 中出现“无法在类路径上找到 XXX.gwt.xml”错误

    将 Maven GWT 项目导入 Eclipse 后 调试器无法工作 抱怨它 Unable to find ProjectName gwt xml on your classpath 你如何修复这个错误 事实证明 当您将某些 GWT 项目调
  • GWT - 让 CellTable 单元格使用 HTML?

    我有一个 CellTable 我想将 HTML 代码放入单元格中 以下代码不起作用 空格已从输出中删除 TextColumn
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1

随机推荐

  • HTML5 音频 - currentTime 属性不准确?

    我正在研究一下 HTML5
  • 逐行测试多个(并非所有)列是否相等

    我想按行检查多列是否全部相等 我想出了一种复杂的方法来计算每组每个值的出现次数 但这似乎有些 麻烦 样本数据 sample df lt data frame id letters 1 6 group rep c r l 3 stringsA
  • 比较两个音频文件[重复]

    这个问题在这里已经有答案了 基本上 我有很多代表同一首歌的音频文件 然而 有些歌曲的质量比原曲差 有些经过编辑 与原曲不再相符 我想做的是以编程方式将这些音频文件与原始音频文件进行比较 看看哪些音频文件与该歌曲匹配 无论质量如何 直接比较显
  • 加载 MySQLdb 模块时出错“您安装了 mysqlclient 还是 MySQL-python?”

    我正在使用 Windows 10 命令行使用 python34 进行 django 项目 但是 我在 SQL 方面遇到了困难 我已经使用安装了 mysqlclientpip install mysqlclient 1 3 5并找到了该文件以
  • 检查 Python 字典列表中是否已存在值?

    我有一个 Python 字典列表 如下所示 a main color red second color blue main color yellow second color green main color yellow second c
  • 没有名为“tensorflow.keras.layers.experimental.preprocessing”的模块

    代码下面 import numpy as np np random seed 0 from sklearn import datasets import matplotlib pyplot as plt matplotlib inline
  • 位域,为什么要特定于实现?

    C C 位域似乎在硬件驱动程序和二进制网络传输中有很多应用 然而 它们似乎没有被广泛使用 并且通常不被鼓励 因为实际的二进制布局是特定于实现的 如 C99 标准 6 7 2 1 10 结构和联合说明符 中的引用所示 实现可以分配足够大的任何
  • removefromsuperview是否释放scrollview的对象?

    for UIView subview in scrollView subviews NSLog subviews Count d scrollView subviews count subview release subview remov
  • 如何让图标出现在新窗口中?

    我正在打开一个新窗口 向其中注入正文和头部的 HTML 问题出在标题部分 HTML 包含标题和图标 但图标不显示 这是代码和 jsFiddle https jsfiddle net ufnjspgc function Start TheBu
  • 如何告诉 LLDB 将信号传递给程序

    我在 lldb 中为安装在 MacOS 上的基于 C 语言的应用程序设置了很多断点 断点大多设置在应用程序的同一函数中 然而 第二天我回到应用程序继续处理它 并开始在同一个函数中再次设置断点 出现了一个问题 断点不是发生在应用程序函数内部
  • React Native:如何在 Android 和 iOS 中打开操作系统设置?

    我正在开发一个mobile应用程序使用反应本机我想在其中打开移动设备的settings当用户clicks在特定按钮上 我已经经历了docsRN 但仍然找不到任何可以帮助我实现同样目标的东西 有人可以吗guide我也一样 请问如何实施 谢谢
  • java 当鼠标点击时画一个圆

    我正在编写一个程序 当单击鼠标时 将绘制一个圆圈 以下是我到目前为止编写的代码 import java awt import javax swing import java awt event ActionEvent import java
  • 多模块项目中的 Maven 测试依赖关系

    我使用 Maven 构建一个多模块项目 我的模块 2 依赖于编译范围内的模块 1 src 以及测试范围内的模块 1 测试 模块 2
  • android studio logcat 删除日期、进程信息

    最近一次 Android Studio 更新后 目前我运行的是 3 1 2 logcat 开始间歇性地删除时间戳和 PID 信息 05 01 13 26 03 962 12909 12909 com perinote perinote D
  • 为什么“summarize”会删除一个组?

    我在胡闹babynames pkg A group by命令有效 但之后summarize 其中一个组将从组列表中删除 library babynames babynames 1 10000 gt group by year name gt
  • D3.js线性回归

    我搜索了一些有关构建线性回归的帮助 并在这里找到了一些示例 非线性回归函数还有一些应该涵盖这一点的 js 库 但不幸的是我无法使它们正常工作 简单统计 js和这个 回归 js With regression js我能够得到m and b线的
  • Android:注册意图过滤器以使用我的应用程序打开电子邮件附件

    我有一个可以生成自定义文件类型 sor 的应用程序 在应用程序内部 我有一个功能可以发送附有这些文件之一的电子邮件 我还有一个意图过滤器 允许应用程序显示在可以打开此类文件的应用程序列表中 这使我 有时 可以直接从手机上的用户电子邮件客户端
  • 强类型数据集与弱类型数据集

    Net 中的强类型数据集是什么意思 有人可以用一个清晰 而简短的例子来解释吗 另外 强类型数据集和弱类型数据集之间有什么区别 强类型数据集基于 Db Schema 生成 它们由从 DataSet DataTable 和 DataRow 派生
  • Django TestCase 不使用辅助数据库上的事务

    我正在使用 Django 1 3 1 我有两个数据库 我的一些模型位于一个数据库中 一些模型位于另一个数据库中 这两个数据库都是 contrib gis db backends postgis 数据库 令我惊讶的是 Django 的 Tes
  • GWT:如何避免在生成的JavaScript代码中调用dynamicCast和canCastUnsafe?

    我正在用 Java 编写一些特殊用途的数据结构 旨在在浏览器中使用 使用 GWT 编译为 JavaScript 我正在尝试匹配一些内置 JDK 类的性能 我注意到运行速度相当快 但是当我将我的代码跟踪与一些模拟的 JDK 代码进行比较时 我