当前位置: 首页 > 面试题库 >

如果性能很重要,是否应该使用Java的String.format()?

马清野
2023-03-14
问题内容

我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用StringBuffer(很多追加,线程安全)和StringBuilder(很多追加,非线程安全)。

有什么使用建议String.format()?是高效的,还是在性能很重要的情况下我们被迫坚持采用单线连接?

例如丑陋的旧风格,

String s = "What do you get if you multiply " + varSix + " by " + varNine + "?";

对比整齐的新样式(String.format,可能会更慢),

String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine);

注意:我的特定用例是整个代码中数百个“单行”日志字符串。他们不涉及循环,所以StringBuilder太重了。我String.format()特别感兴趣。


问题答案:

我编写了一个小类进行测试,该类具有两者的更好性能,并且+领先于格式。以5到6的倍数进行尝试

import java.io.*;
import java.util.Date;

public class StringTest{

    public static void main( String[] args ){
    int i = 0;
    long prev_time = System.currentTimeMillis();
    long time;

    for( i = 0; i< 100000; i++){
        String s = "Blah" + i + "Blah";
    }
    time = System.currentTimeMillis() - prev_time;

    System.out.println("Time after for loop " + time);

    prev_time = System.currentTimeMillis();
    for( i = 0; i<100000; i++){
        String s = String.format("Blah %d Blah", i);
    }
    time = System.currentTimeMillis() - prev_time;
    System.out.println("Time after for loop " + time);

    }
}

对不同的N运行上面的结果表明,两者的行为均呈线性,但String.format慢5-30倍。

原因是在当前实现中,String.format首先使用正则表达式解析输入,然后填充参数。另一方面,与plus的连接通过javac(而不是JIT)进行优化,并StringBuilder.append直接使用。



 类似资料:
  • 问题内容: 使用Java 8和lambda,可以很容易地将集合作为流进行迭代,也很容易使用并行流。docs中的两个示例,第二个示例使用parallelStream: 只要我不关心顺序,使用并行会始终有益吗?有人会认为,更快地将工作划分到更多的内核上。 还有其他考虑事项吗?什么时候应该使用并行流,什么时候应该使用非并行? (问这个问题可以引发关于如何以及何时使用并行流的讨论,不是因为我认为始终使用并

  • 这里有一个声明主子程序的简短Perl 6程序。我应该只看到输出,如果我直接执行程序: 当我直接执行程序时,我会看到输出: 如果将其作为模块加载,则看不到输出: 同样,如果我在程序内部使用它,我看不到输出: 但是,如果我使用,我会得到以下输出: Synopsis06字面上说编译单元是直接调用的,而不是被需要的。是否因为在运行时起作用(尽管S06不排除这一点)而发生了其他事情? 我在2016年7月和2

  • 微丝网应该可重复使用吗?对于可重用,我并不意味着共享特定于域的模型。 我的意思是,为一个应用程序创建的微服务是否应该在另一个应用程序中重用?如果它们可以在应用程序中重用,是否足够? 分离微服务的最佳方法是什么。从我的观点来看,一旦一个微服务调用另一微服务,它就会紧密耦合,这意味着它不容易(无需修改)被提取并放入另一个没有它所引用/来自的相同服务的微服务应用程序中。 在我看来,要使它们脱钩,有以下几

  • 问题内容: 我有一个表,该表具有指向两个不同表的两个外键,两个外键 共享一个列 : 如您所见,有两个FK共享country_code(恰好在引用路径的末尾引用同一列)。实体类看起来像(JPA 1.0 @IdClass): 如您所见,我将countryCode属性和城市的country_code @JoinColumn标记为只读(insertable = false,可更新= false)。Hibe

  • AccessibilityService在系统的内存管理方面与普通服务有何不同? 我想问的是:系统可以为了节省内存而关闭AccessibilityService吗?如果可以,当您进入AccessibilityService时,您会看到它打开还是关闭?用户是否必须再次手动打开? 使用startForeground是否有助于使AccessibilityService保持活动状态? 在一个类似的问题中,

  • 关于tsconfig.json的官方手册说: 如果tsconfig.json中没有“files”属性,则编译器默认将所有TypeScript(*.ts或*.tsx)文件包含在包含目录和子目录中。当存在“files”属性时,只包含指定的文件。 如果指定了“exclude”属性,则编译器将包括包含目录和子目录中的所有TypeScript(*.ts或*.tsx)文件,但排除的文件或文件夹除外。 “Fil