slow/fast 相对于其他编译语言,Java 中的字符串连接如何?
How slow/fast is String concatenation in Java relative to other compiled languages?
我刚刚开始使用 Java,在通读 this guide 时,我注意到以下片段,描述了 Junit 框架的最新更新。
We can now write assertion messages in a lambda in JUnit 5, allowing
the lazy evaluation to skip complex message construction until needed:
@Test
public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation() {
Assertions.assertTrue(
2 == 3,
() -> "Numbers " + 2 + " and " + 3 + " are not equal!");
}
作为 Java 的新手,这感觉像是一个大型实现,只是为了解决字符串连接问题。
在 Java 中评估字符串真的那么慢(相对于其他语言?)。它与其他编译语言(如 C、Golang 等)相比如何?
重点是:Java.
中没有 lazy 字符串格式
意思是,在像 C 这样的语言中,您可能会看到如下内容:
#define debug_print...
(见一些现实世界的例子here)
我们的想法是定义一个宏,您可以向其传递一个复杂的字符串。但是编译器确保只在实际存在该字符串的情况下生成代码。
含义:当使用 debug_print()
时,构建传递给宏调用的消息可能需要复杂的字符串连接 only 当消息确实是需要!消息被延迟连接。
在Java中,我们根本无法表达这一点。你总是要走
if (someCondition) {
then pull together that large string
这不太好,尤其是在进行跟踪时。我们小组中的一些人编写了该代码,每个跟踪语句都有该前导 if 语句,这实在是太烦人了。这会大大降低您的整个代码的可读性。
因此:这 根本 与字符串连接的成本无关。如果确实需要该字符串,则大约 仅 花费所需的 CPU 周期。
并回答实际问题:最后,当该代码被足够频繁地调用时,JIT 无论如何都会将其转换为经过仔细优化的机器代码。因此:实际的字符串连接是 而不是 问题。
换句话说:就源代码而言,您不会想到"performance" for Java。重要的是 JIT 在运行时发生了什么。
这是底线。从 Java 开始,不必担心像字符串连接这样的小性能问题。对于完成大量字符串连接但未使用结果的大型应用程序服务器来说,这可能是一个小问题。一个例子是日志记录,其中的日志级别导致事件被忽略。此外,Java 使用 StringBuilder 连接一系列由“+”运算符分隔的文字,这是相当高效的。
我刚刚开始使用 Java,在通读 this guide 时,我注意到以下片段,描述了 Junit 框架的最新更新。
We can now write assertion messages in a lambda in JUnit 5, allowing the lazy evaluation to skip complex message construction until needed:
@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation() { Assertions.assertTrue( 2 == 3, () -> "Numbers " + 2 + " and " + 3 + " are not equal!"); }
作为 Java 的新手,这感觉像是一个大型实现,只是为了解决字符串连接问题。
在 Java 中评估字符串真的那么慢(相对于其他语言?)。它与其他编译语言(如 C、Golang 等)相比如何?
重点是:Java.
中没有 lazy 字符串格式意思是,在像 C 这样的语言中,您可能会看到如下内容:
#define debug_print...
(见一些现实世界的例子here)
我们的想法是定义一个宏,您可以向其传递一个复杂的字符串。但是编译器确保只在实际存在该字符串的情况下生成代码。
含义:当使用 debug_print()
时,构建传递给宏调用的消息可能需要复杂的字符串连接 only 当消息确实是需要!消息被延迟连接。
在Java中,我们根本无法表达这一点。你总是要走
if (someCondition) {
then pull together that large string
这不太好,尤其是在进行跟踪时。我们小组中的一些人编写了该代码,每个跟踪语句都有该前导 if 语句,这实在是太烦人了。这会大大降低您的整个代码的可读性。
因此:这 根本 与字符串连接的成本无关。如果确实需要该字符串,则大约 仅 花费所需的 CPU 周期。
并回答实际问题:最后,当该代码被足够频繁地调用时,JIT 无论如何都会将其转换为经过仔细优化的机器代码。因此:实际的字符串连接是 而不是 问题。
换句话说:就源代码而言,您不会想到"performance" for Java。重要的是 JIT 在运行时发生了什么。
这是底线。从 Java 开始,不必担心像字符串连接这样的小性能问题。对于完成大量字符串连接但未使用结果的大型应用程序服务器来说,这可能是一个小问题。一个例子是日志记录,其中的日志级别导致事件被忽略。此外,Java 使用 StringBuilder 连接一系列由“+”运算符分隔的文字,这是相当高效的。