我知道这是微小优化,但由于方法将被执行数百万次,因此这是必要的。
在 Java 中使用正则表达式的方法,如 split() 或使用 equals() 进行字符串比较。
String
类和StringUtils
中的方法都是为特定任务高度优化的。不同的方法旨在解决略有不同的任务。尝试选择最符合您要解决的任务的方法,很可能会获得非常好的性能。这可能取决于每种特定的方法。大多数方法表示非常基本的代码,人们经常需要手写,例如
return s1 == s2 || (s1 == null && s2 == null) || (s1 != null && s1.equals( s2 ) );
这段代码很可能会被热点编译器优化,甚至会删除方法调用。我猜你能找到的唯一时间节省就是在编写代码时。
如其他地方所建议的那样,我建议您自己对您感兴趣的方法进行基准测试,使用System.currentTimeMillis()
在一个循环中调用该方法,传入一些随机字符串;随机是因为您不希望它被优化掉。
s1
和s2
都是null,则s1 == s2
为真。 - Geoff我认为它并没有进行任何优化,Apache Commons 包含了“辅助工具”,这意味着它更适合于开发的效率,而不是运行时性能效率。
性能也可能会随着使用的 JVM 而改变。
我可以理解,你担心大量执行或大数据的性能问题。但这并不意味着在这方面不存在“微观优化谬论”。花费更多时间思考和尝试其他方法来提高这些基本任务的性能(在与机器上的 CPU 数量相同的线程中运行,等等)肯定更有效率。把这样的低级别事情留给 JVM 更明智。根据我的经验,即时编译器通常比任何开发人员更聪明。
如果你真的想走这条路,你应该测试一下。这并不难,如果性能取决于数据,你可能有合适的数据来测试。
首先,您是否设置了性能标准?您希望获得多少性能提升?
其次,您是否在实际负载下对整个应用程序进行了分析?您应该做的第一件事是确保您正在处理代码的正确部分。
无论如何,您的问题过于模糊,无法在此回答。您需要提供有关您正在处理的数据集以及实际执行的操作的更多信息。例如,优化String.equals的一个技巧是将String实例合并。您将为首次创建实例支付相当高的前期成本,但稍后equals应该基于 == 返回true,而不必进行完全比较。您需要根据所涉及的数据集和数据处理方式来决定是否应用此优化。
你为什么要寻求更快的速度?难道你没有性能要求吗?这将决定你是否足够快。只要满足要求,就可以转向下一个问题。"哪个更快?"的问题意味着你还没有尝试过任何一个。选择一个,检查是否满足性能要求,只有在不满足要求时才检查另一个。
它们并不是竞争关系。StringUtils
不是 String
类中方法的替代品,而是在更高层次上的常见习语集合。StringUtils
在大多数情况下调用 String
。除非使用反射,否则它无法执行其他操作。
StringUtils#split
比 String#split
更快。
String#equals
比 StringUtils#equals
更快。