【问题标题】:Is Object.class.getName() Slow?Object.class.getName() 慢吗?
【发布时间】:2012-07-31 22:10:49
【问题描述】:

我在 Java ME 环境中编写代码,所以速度绝对是一个重要因素。我已经阅读了几个地方,任何类型的反射(即使是 Java ME 上允许的非常有限的数量)都可能是一个非常大的瓶颈。

所以,我的问题是:做String.class.getName() 慢吗? myCustomObject.getClass().getName() 呢?用“java.lang.String”和“com.company.MyObject”等字符串常量替换它们会更好吗?

如果您想知道,我需要所有基元(以及非基元)的类名,因为 Java ME 不提供默认的序列化实现,因此我必须自己实现。我需要一个通用的序列化解决方案,它既适用于跨网络的通信,也适用于本地存储(RMS,也适用于 JSR-75)

编辑

我正在使用 Java 1.3 CLDC。

【问题讨论】:

  • 你试过基准测试吗?
  • 如果你知道一个对象的类,那么问它是没有意义的。 String.class.getName() 可以替换为“java.lang.String”。如果你不知道一个对象的类型,你不问怎么能知道?先写吧。措施。当且仅当您遇到问题时,找出问题的根源,并在需要的地方进行优化。
  • 我想对它进行基准测试,但我的项目目前处于混乱状态,我需要几个小时(可能是几天)才能让这段代码进入编译并再次运行的状态。现在我将使用常量(谢谢大家),但稍后我会回来提供基准测试信息。
  • 你打算连载什么?远程通信或持久性到 rms / 文件或其他东西?
  • “我在 Java ME 环境中编写代码,所以速度绝对是一个重要因素。”——在这个优化级别上可能是错误的。分析/基准测试结果是速度一直很重要的唯一原因。

标签: java serialization reflection java-me cldc


【解决方案1】:

String.class.getName() 不会很慢,因为它的值将在执行之前加载。即编译器将在 line 执行之前放置它的值。 myCustomObject.getClass().getName() 会比之前的稍,因为它会在执行时被检索到

【讨论】:

  • 在JME模拟器上验证,做String.class.getName()的时间可以忽略不计
【解决方案2】:

反射并不是不自然地慢;它和您预期的一样慢,但不会更慢。首先,通过反射调用方法需要从反射 API 中显而易见的所有对象创建和方法调用,其次,如果您通过反射调用方法,Hotspot 将无法通过调用进行优化。

调用getClass().getName() 也不会比您预期的慢:几个虚拟方法调用加上一个成员变量获取的成本。 .class 版本本质上是相同的,只是加上或减去了一个变量提取。

【讨论】:

    【解决方案3】:

    我不能代表 Java ME,但我对在资源受限系统上使用反射的开销并不感到惊讶。我不认为它慢得令人难以忍受,但您肯定会看到将名称硬编码到变量中的改进。

    既然你提到你正在研究序列化,我建议你看看它是如何在Kryo 项目中完成的。你可能会发现他们的一些方法很有用,你甚至可以在 Java ME 中使用它。 (不幸的是,我对我没有经验)

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 2014-03-26
      • 2013-08-05
      • 2016-05-28
      • 2012-12-29
      相关资源
      最近更新 更多