使用StringUtils方法比Java方法运行更快?

5
我想知道来自 Apache Commons Lang 库的 StringUtils 方法是否比 Java String 方法运行得更快。
我知道这是微小优化,但由于方法将被执行数百万次,因此这是必要的。
在 Java 中使用正则表达式的方法,如 split() 或使用 equals() 进行字符串比较。

11
执行每个操作一百万次,并计时。 - Brian Roach
2
(或者至少,更加精确一些...) - user166390
7个回答

3
Java中String类和StringUtils中的方法都是为特定任务高度优化的。不同的方法旨在解决略有不同的任务。尝试选择最符合您要解决的任务的方法,很可能会获得非常好的性能。
如果有两种看起来同样好的方法,并且必须获得每一点性能,则需要测量它们的实际数据上的性能。
但也请记住,通常更便宜的方法是购买更快的计算机,而不是花费数小时的开发时间微调代码以使其在慢速计算机上运行得更快。

1

这可能取决于每种特定的方法。大多数方法表示非常基本的代码,人们经常需要手写,例如

return s1 == s2 || (s1 == null && s2 == null) || (s1 != null && s1.equals( s2 ) );

这段代码很可能会被热点编译器优化,甚至会删除方法调用。我猜你能找到的唯一时间节省就是在编写代码时。

如其他地方所建议的那样,我建议您自己对您感兴趣的方法进行基准测试,使用System.currentTimeMillis()在一个循环中调用该方法,传入一些随机字符串;随机是因为您不希望它被优化掉。


1
System.nanoTime() 更适合用于性能测试,因为它不受系统时钟的影响并提供更精确的时间。 - Geoff
在你的例子中,中间的从句是不必要的,因为如果s1s2都是null,则s1 == s2为真。 - Geoff

1

我认为它并没有进行任何优化,Apache Commons 包含了“辅助工具”,这意味着它更适合于开发的效率,而不是运行时性能效率。

性能也可能会随着使用的 JVM 而改变。

我可以理解,你担心大量执行或大数据的性能问题。但这并不意味着在这方面不存在“微观优化谬论”。花费更多时间思考和尝试其他方法来提高这些基本任务的性能(在与机器上的 CPU 数量相同的线程中运行,等等)肯定更有效率。把这样的低级别事情留给 JVM 更明智。根据我的经验,即时编译器通常比任何开发人员更聪明。

如果你真的想走这条路,你应该测试一下。这并不难,如果性能取决于数据,你可能有合适的数据来测试。


这些是大胆的陈述! - NathanChristie

0

首先,您是否设置了性能标准?您希望获得多少性能提升?

其次,您是否在实际负载下对整个应用程序进行了分析?您应该做的第一件事是确保您正在处理代码的正确部分。

无论如何,您的问题过于模糊,无法在此回答。您需要提供有关您正在处理的数据集以及实际执行的操作的更多信息。例如,优化String.equals的一个技巧是将String实例合并。您将为首次创建实例支付相当高的前期成本,但稍后equals应该基于 == 返回true,而不必进行完全比较。您需要根据所涉及的数据集和数据处理方式来决定是否应用此优化。


0

你为什么要寻求更快的速度?难道你没有性能要求吗?这将决定你是否足够快。只要满足要求,就可以转向下一个问题。"哪个更快?"的问题意味着你还没有尝试过任何一个。选择一个,检查是否满足性能要求,只有在不满足要求时才检查另一个。


0

它们并不是竞争关系。StringUtils 不是 String 类中方法的替代品,而是在更高层次上的常见习语集合。StringUtils 在大多数情况下调用 String。除非使用反射,否则它无法执行其他操作。


0

StringUtils#splitString#split 更快。

String#equalsStringUtils#equals 更快。


6
您有任何支持您回答的证据吗? - Mohammad Faisal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接