String.isEmpty()比"" .equals(s)或s.equals("")效能更快 - Dmytro Dumanskiy

banq發表於2020-08-09

讓我們看一下以下基本程式碼:

if (s != null && s.equals(“”)) {
}


if (“”.equals(s)) {
}

乍一看,它看起來像是正確的程式碼。但是,如果我們考慮效能,那不是最佳選擇。讓我們稍微改變一下方法,改用String.isEmpty()方法:

if (s != null && s.isEmpty()) {

}

改用isEmpty以後的新程式碼速度提高了約20–40%!

效能測試程式碼:

@BenchmarkMode(Mode.AverageTime)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 5, time = 1)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Measurement(iterations = 10, time = 1)
public class EmptyStringEquals {

   @Param({"", "nonEmptyString"})
   private String strParams;

   @Benchmark
   public boolean nonNullAndIsEmpty() {
       return strParams != null && strParams.isEmpty();
   }

   @Benchmark
   public boolean equalsPost() {
       return strParams != null && strParams.equals("");
   }

   @Benchmark
   public boolean preEquals() {
       return "".equals(strParams);
   }

}
測試結果:
EmptyStringEquals.equalsPost                         avgt   10  4.240 ± 0.058  ns/op
EmptyStringEquals.nonNullAndIsEmpty                  avgt   10  2.985 ± 0.048  ns/op
EmptyStringEquals.preEquals                          avgt   10  4.243 ± 0.062  ns/op

EmptyStringEquals.equalsPost         nonEmptyString  avgt   10  3.522 ± 0.034  ns/op
EmptyStringEquals.nonNullAndIsEmpty  nonEmptyString  avgt   10  2.894 ± 0.048  ns/op
EmptyStringEquals.preEquals          nonEmptyString  avgt   10  3.672 ± 0.016  ns/op



基準測試的原始碼,因此您可以自己嘗試。

相關文章