簡體   English   中英

借助箭頭 (->) 切換表達式,現在可以產生/返回值

[英]Switch expression with help of arrow (->), and now can yield/return the value

Java 14 中擴展的 switch 表達式,除了程序員/審閱者的視覺清晰度之外,switch 表達式的需求是不清楚的。 是嗎

  1. 與舊的 switch 表達式不同的字節碼實現?
  2. 與以前的版本相比,在執行方面有什么性能改進嗎?

參考: https : //www.techgeeknext.com/java/java14-features

JDK 14 版本:

 int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

JDK 14 字節代碼

   0: iconst_1
   1: istore_1
   2: iload_1
   3: tableswitch   { // 1 to 7
                 1: 44
                 2: 44
                 3: 44
                 4: 49
                 5: 54
                 6: 54
                 7: 59
           default: 64
      }
  44: bipush        6
  46: goto          65
  49: bipush        7
  51: goto          65
  54: bipush        8
  56: goto          65
  59: bipush        9
  61: goto          65
  64: iconst_0
  65: istore_2
  66: return

JDK - 10 代碼

int numLetters;
int day = 1;
switch (day) {
  case 1:
  case 2:
  case 3:
    numLetters = 6;
    break;
  case 4:
    numLetters = 7;
    break;
  case 5:
  case 6:
    numLetters = 8;
    break;
  case 7:
    numLetters = 9;
    break;
  default:
    numLetters = 0;
}

JDK - 10 字節代碼

   0: iconst_1
   1: istore_2
   2: iload_2
   3: tableswitch   { // 1 to 7
                 1: 44
                 2: 44
                 3: 44
                 4: 50
                 5: 56
                 6: 56
                 7: 62
           default: 68
      }
  44: bipush        6
  46: istore_1
  47: goto          70
  50: bipush        7
  52: istore_1
  53: goto          70
  56: bipush        8
  58: istore_1
  59: goto          70
  62: bipush        9
  64: istore_1
  65: goto          70
  68: iconst_0
  69: istore_1
  70: return

除了塊內的局部賦值減少了 JIT 指令之外,原語沒有重大區別。

就像switch String ,字節碼沒有改變,也沒有必要。

雖然字節碼是專門為作為編譯 Java 源代碼的目標而設計的,但它並沒有以同樣的方式受到限制。 另請參閱Java 語言中不可用的字節碼功能……

switch表達式利用了一個以前不被普通 Java 代碼使用但肯定被自動代碼生成器或編譯器用於其他面向 JVM 的編程語言的特性,在 switch 案例的不同分支中將值推送到操作數堆棧的可能性,以在合並點之后使用。 對於舊的switch語句,您總是必須將值存儲到局部變量中並在合並點之后加載它。

〈另一個未被普通 Java 代碼利用但與 Java 字節碼兼容的特性是(ab)使用 switch 指令來產生花哨的循環,只需在 switch 指令之前設置目標位置。 誰知道某些源代碼功能是否會在未來的語言版本中利用它……>

但是是否使用中間局部變量,應該無關緊要。 優化器將代碼轉換為SSA 形式后,即使在其他代碼轉換和優化應用之前,本地變量和操作數堆棧之間的所有傳輸都已消除。

這並不排除由特定實現(版本)中的 switch 指令的細微變化引起的令人驚訝的性能差異

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM