Java 中 10 大简单的性能优化( 四 )

第一件事:总是(不仅在NOPE 分支中)提前中止每个equals()方法,如果:

  • this == argument
  • this "incompatible type" argument
请注意,后一个条件包括argument == null, 如果您instanceof用于检查兼容类型 。我们之前在10 Subtle Best Practices when Coding Java中对此进行了博文 。现在,在明显情况下尽早中止比较之后,您可能还希望在可以做出部分决定时尽早中止比较 。例如,约定Table.equals()是两个表被认为是相等的,它们必须具有相同的名称,而不管具体的实现类型如何 。例如,这两项不可能相等:
  • com.example.generated.Tables.MY_TABLE
  • DSL.tableByName("MY_OTHER_TABLE")
如果argument 不能等于this,并且我们可以轻松地检查它,那么让我们这样做并在检查失败时中止 。如果检查成功,我们仍然可以从super. 鉴于宇宙中的大多数对象都不相等,我们将通过快捷方式节省大量 CPU 时间 。
10、在集合中思考,而不是在单个元素最后但并非最不重要的一点是,有一件事与 Java 无关,但适用于任何语言 。此外,我们将离开N.O.P.E.分支,因为此建议可能只会帮助您从 迁移到,或类似的东西 。不幸的是,许多程序员从简单的本地算法的角度来思考 。他们正在逐步解决问题,一个分支一个分支,一个循环一个循环,一个方法一个方法 。这就是命令式和/或函数式编程风格 。虽然在从纯命令式到面向对象(仍然是命令式)再到函数式编程时,对“更大的图景”进行建模变得越来越容易,但所有这些风格都缺乏只有 SQL 和 R 以及类似语言才有的东西:声明式编程 。在 SQL 中(我们喜欢它,因为这是O(N3)O(n log n)) 你可以声明你想从你的数据库中得到的结果,而不会对算法产生任何影响 。然后,数据库可以考虑所有可用的元数据(例如约束、键、索引等),以找出可能的最佳算法 。从理论上讲,这从一开始就是SQL 和关系演算背后的主要思想 。使用集合的主要优点是您的算法将变得更加简洁 。
而不是:
// Pre-Java 8Set result = new HashSet();for (Object candidate : someSet)if (someOtherSet.contains(candidate))result.add(candidate); // Even Java 8 doesn't really helpsomeSet.stream().filter(someOtherSet::contains).collect(Collectors.toSet());有些人可能会争辩说,函数式编程和 Java 8 将帮助您编写更简单、更简洁的算法 。这不一定是真的 。您可以将命令式 Java-7 循环转换为功能性 Java-8 Stream 集合,但您仍在编写相同的算法 。编写类似 SQL 的表达式是不同的 。
SomeSet 相交 SomeOtherSet
可以通过实现引擎以 1000 种方式实现 。EnumSet正如我们今天所了解的,在运行操作之前将这两个集合自动转换为明智的做法INTERSECT 。也许我们可以在INTERSECT不进行低级调用的情况下将其并行化Stream.parallel()
11、结论在本文中,我们讨论了在N.O.P.E.分支上进行的优化,即在高复杂度算法的深处 。
  • 每个查询仅在单个上生成StringBuilder
  • 我们的模板引擎实际上是解析字符,而不是使用正则表达式
  • 我们尽可能使用数组,尤其是在迭代侦听器时
  • 我们远离我们不必调用的 JDBC 方法
  • 等等…

作者:终码一生
链接:
https://juejin.cn/post/7078286560034029575

【Java 中 10 大简单的性能优化】


推荐阅读