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

GWT:如何避免在生成的JavaScript代码中调用dynamicCast和CancastSafe?,gwt,Gwt,我正在用Java编写一些专用数据结构,用于浏览器(使用GWT编译为JavaScript) 我试图匹配一些内置JDK类的性能,我注意到它们运行得相当快,但是当我将我的代码跟踪与一些模拟JDK代码进行比较时,我的代码跟踪有很多对dynamicCast和CancastSafe的调用,而JDK模拟类则没有。这也正是性能差异的原因 有没有GWT大师知道如何避免这种情况?这相当于20%的管理费用:-( 详情: 以下是10000个随机整数插入到两个不同数据结构中的配置文件输出(在Firebug中捕获): Go

我正在用Java编写一些专用数据结构,用于浏览器(使用GWT编译为JavaScript)

我试图匹配一些内置JDK类的性能,我注意到它们运行得相当快,但是当我将我的代码跟踪与一些模拟JDK代码进行比较时,我的代码跟踪有很多对dynamicCast和CancastSafe的调用,而JDK模拟类则没有。这也正是性能差异的原因

有没有GWT大师知道如何避免这种情况?这相当于20%的管理费用:-(

详情:

以下是10000个随机整数插入到两个不同数据结构中的配置文件输出(在Firebug中捕获):

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

我的代码(AVL树):

Profile(5397.686ms,898603次呼叫)
函数调用自己的时间百分比
$insert 120899 25.06%1352.827ms
$120899 17.94%968.17ms

dynamicCast 120899 14.12%762.307ms使用java 1.5泛型和通配符可以避免这种情况吗?

如果您在GWT贡献者论坛上看到过,您不知道

基本上,它从您识别的相同问题开始,提出了一些新的编译器标志,并继续展示如何使用一些JSNI绕过强制转换


Edit在GWT主干中有一个新的编译器标志。请参阅…

不幸的是,我仍然不清楚原因,但根据我的经验,它似乎来自显式转换,如:

((Comparable) obj).compareTo(other)
生成的Javascript如下所示:

dynamicCast(obj, 1).compareTo(other);
其中1是一个生成的typeId,表示强制转换的目标。dynamicCast依次调用CancastSafetable,如果为false,则抛出ClassCastException。此值为,因为在托管模式下已捕获此值

使用JSNI可以避开它:

public static native int compare(Object a, Object b) /*-{
    return a.@java.lang.Comparable::compareTo(Ljava/lang/Object;)(b); 
}-*/;
GWT 2.1版及更高版本的更新答案:

自GWT2.1(至少这是第一次提到)以来,GWT编译器有一个名为
-XdisableCastChecking
的新编译器参数,该参数禁用强制转换的所有运行时检查。 注意,这个选项被标记为实验性的(可能是因为这会使类强制转换异常很难调试)

在我的应用程序中,
dynamicCast
在短配置文件运行中被调用了数千次,是Firebug profiler中第三个最耗时的方法。使用此编译器参数可显著减少Chrome Speed Tracer中“长时程事件”消息的数量


有关此编译器参数和其他编译器参数,请参阅。

这肯定是编译器的问题:我在下面一行遇到了问题:

final DefaultIconedSuggestBox<SuggestValueProxy, IconedValueHolderItem<SuggestValueProxy>> fieldValueWidget = getCategoryWidget().getFieldValueWidget();
final DefaultIconedSuggestBox fieldValueWidget=getCategoryWidget().getFieldValueWidget();

我真的不知道如何解决这个问题:这一行发生在我从一个模块切换到另一个模块的瞬间(可能与代码拆分器问题有关:即使我没有使用代码拆分:我只是在加载另一个带有另一个模块的页面)

事实上,我认为应该,但不是……从我发现的情况来看,这似乎是编译器的一个缺点。巧合的是,我昨天发现了那个线程,这实际上是我昨天提出的JSNI解决方案。
dynamicCast(obj, 1).compareTo(other);
public static native int compare(Object a, Object b) /*-{
    return a.@java.lang.Comparable::compareTo(Ljava/lang/Object;)(b); 
}-*/;
final DefaultIconedSuggestBox<SuggestValueProxy, IconedValueHolderItem<SuggestValueProxy>> fieldValueWidget = getCategoryWidget().getFieldValueWidget();