问题:Java中的异常处理实际上是否很慢?
传统观念以及许多谷歌搜索结果表明,不应将特殊逻辑用于Java中的正常程序流程.通常有两个原因,
和
这个问题是关于#1.
例如,这个页面将Java异常处理描述为"非常慢",并将缓慢与异常消息字符串的创建联系起来 - "然后将此字符串用于创建抛出的异常对象.这并不快." Java中的有效异常处理这篇文章说"其原因在于异常处理的对象创建方面,从而使异常本身变得缓慢".另一个原因是堆栈跟踪生成减慢了它的速度.
我的测试(使用Java 1.6.0_07,Java HotSpot 10.0,在32位Linux上)表明异常处理并不比常规代码慢.我尝试在循环中运行一个执行一些代码的方法.在方法结束时,我使用布尔值来指示是返回还是抛出.这样实际处理是一样的.我尝试以不同的顺序运行方法并平均我的测试时间,认为它可能是JVM升温.在我的所有测试中,投掷至少与返回一样快,如果不是更快(最多快3.1%).我对我的测试错误的可能性持开放态度,但我没有看到代码示例,测试比较或过去一两年中显示Java中的异常处理的结果慢.
让我沿着这条路走下去的是我需要使用的API,它将异常作为正常控制逻辑的一部分.我想在他们的使用中纠正它们,但现在我可能无法做到.相反,我是否必须赞美他们的前瞻性思维?
在即时编译中的高效Java异常处理文章中,作者建议单独存在异常处理程序,即使没有抛出异常,也足以阻止JIT编译器正确优化代码,从而减慢它的速度.我还没有测试过这个理论.
以下哪项更好?
a instanceof B
Run Code Online (Sandbox Code Playgroud)
要么
B.class.isAssignableFrom(a.getClass())
Run Code Online (Sandbox Code Playgroud)
我所知道的唯一区别是,当'a'为null时,第一个返回false,而第二个抛出异常.除此之外,他们总是给出相同的结果吗?
在我的应用程序中,我有一个2d实体数组来表示网格.网格中的每个位置都可以为空或由实体占用(在这种情况下,它只是一个人或墙).现在我instanceof用来检查一个实体是一个人还是一堵墙.
我正在考虑为每个实体提供一个方法,该方法返回一个enum说明其类型的方法,即墙实体将返回EntityType.WALL.我想知道这是否是最好的想法,删除使用instanceof或instanceof适合在这种情况下?
在任何人说什么之前我只是出于好奇而问这个问题; 我不打算根据这个答案做任何过早的优化.
我的问题是关于使用反射和铸造的速度.标准的说法是"反思很慢".我的问题是哪个部分确实很慢,为什么; 特别是在比较某事物是否是另一个实例的父母时.
我非常有信心只是将对象的类与另一个Class对象进行比较的速度与任何比较一样快,大概只是直接比较已经存储在Object状态中的单例对象; 但如果一个班级是另一个班级的父母呢?
我通常认为instanceof它与普通班级检查一样快,但今天我想到了它,似乎有些反思必须在"幕后" instanceof才能发挥作用.我在网上查了一下,发现有人说的instanceof很慢; 大概是因为比较物体的父母所需的反射?
这导致了下一个问题,如何只是铸造.如果我把某事物作为一个物体,那我就得不到了ClassCastException.但是如果将对象转换为自身的父对象,则不会发生这种情况.基本上我正在做一个instanceof电话,或逻辑到那个效果,当我在运行时进行演员表明我不是吗?我从来没有听到过任何人暗示过投射物体之前可能会很慢.不可否认,并非所有演员都是提供对象的父级,但很多演员都是父类.然而,从来没有人暗示这可能会很慢.
那是哪个呢.是instanceof真的没有那么慢?两者都instanceof投射到父类有点慢吗?或者有什么理由可以比instanceof电话更快地完成演员表?
我听说java中的instanceof运算符是一个性能问题,
是否也适用于Javascript(IE6,IE7,IE8,FF,Chrome,Safari等)?任何真实文件的链接都会有所帮助.
我知道有两种类型的转换是隐式和显式转换.我在StackOverflow上阅读了不同的问题,例如this,this和this,但我仍然想知道在Java中投射的成本是多少,避免它是个好主意?它的最佳实践是什么?
铸造有两种类型:
String s = "Cast";
Object o = s; // implicit casting
Object o = someObject;
String s = (String) o; // explicit casting
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,运行时会产生开销,因为必须检查这两种类型,并且如果转换不可行,JVM必须抛出一个ClassCastException.
有人说最好对应用程序进行分析,以确保铸造是否有用.
简介:
...
TypeTag[T]封装某些编译时类型的运行时类型表示T....
...TypeTags的总是由编译器生成....... [1]
TypeTags位于scala.reflect.**包装中.另一个SO回答提到使用java反射会在应用程序中产生运行时性能开销.
问题:s,s和s在运行时使用java反射的
程度如何?它们是在编译时生成的,但它们在使用时是否会导致运行时性能开销?TypeTagClassTagWeakTypeTag
示例:
def isOfType[A : ClassTag : TypeTag, E : ClassTag : TypeTag](actual: A, expected: E): Boolean = {
actual match {
case _ : E if typeOf[A] =:= typeOf[E] => true
case _ => false
}
}
assert( isOfType(List.empty[Int], List.empty[Int]))
assert(!isOfType(List.empty[String], List.empty[Int]))
Run Code Online (Sandbox Code Playgroud)
虽然标签是在编译时生成的,但我可以在运行时感受到延迟.类型比较是否使用了引擎盖下不那么高效的java反射?
请注意,这是一个社区帖子,应根据需要添加示例.如果您无法直接编辑添加示例(问题示例或解决方案)的答案,请在评论中发布带有要点(或类似内容)的链接或添加单独的答案,以便稍后进行集成.
Scala 3可能根本不包含scala.reflect.runtime(Dotty目前没有,并且计划这样做不确定).虽然适用于Scala 2和Dotty的答案可能是转换目的和立即改进性能的首选,但也欢迎Dotty特定的解决方案.
https://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala
我的项目中有一位同事,他深深反对instanceof运营商的使用,因为它"产生了大量的开销",原因是什么?这是真的吗?
有没有其他方法来检查对象的类型而不是使用它?
因为我发现它在某些场合非常有用.
java ×6
casting ×3
instanceof ×3
optimization ×3
reflection ×3
scala ×3
performance ×2
browser ×1
dotty ×1
enums ×1
javascript ×1