CFA branches=50

tsz is 1.3x faster 313 lines 9 KB

Timing

tsz
337.10ms
tsgo
453.66ms

Files

// Control flow analysis stress test

type Entity =
  | { kind: "type0"; data0: string; common: number }
  | { kind: "type1"; data1: string; common: number }
  | { kind: "type2"; data2: string; common: number }
  | { kind: "type3"; data3: string; common: number }
  | { kind: "type4"; data4: string; common: number }
  | { kind: "type5"; data5: string; common: number }
  | { kind: "type6"; data6: string; common: number }
  | { kind: "type7"; data7: string; common: number }
  | { kind: "type8"; data8: string; common: number }
  | { kind: "type9"; data9: string; common: number }
  | { kind: "type10"; data10: string; common: number }
  | { kind: "type11"; data11: string; common: number }
  | { kind: "type12"; data12: string; common: number }
  | { kind: "type13"; data13: string; common: number }
  | { kind: "type14"; data14: string; common: number }
  | { kind: "type15"; data15: string; common: number }
  | { kind: "type16"; data16: string; common: number }
  | { kind: "type17"; data17: string; common: number }
  | { kind: "type18"; data18: string; common: number }
  | { kind: "type19"; data19: string; common: number }
  | { kind: "type20"; data20: string; common: number }
  | { kind: "type21"; data21: string; common: number }
  | { kind: "type22"; data22: string; common: number }
  | { kind: "type23"; data23: string; common: number }
  | { kind: "type24"; data24: string; common: number }
  | { kind: "type25"; data25: string; common: number }
  | { kind: "type26"; data26: string; common: number }
  | { kind: "type27"; data27: string; common: number }
  | { kind: "type28"; data28: string; common: number }
  | { kind: "type29"; data29: string; common: number }
  | { kind: "type30"; data30: string; common: number }
  | { kind: "type31"; data31: string; common: number }
  | { kind: "type32"; data32: string; common: number }
  | { kind: "type33"; data33: string; common: number }
  | { kind: "type34"; data34: string; common: number }
  | { kind: "type35"; data35: string; common: number }
  | { kind: "type36"; data36: string; common: number }
  | { kind: "type37"; data37: string; common: number }
  | { kind: "type38"; data38: string; common: number }
  | { kind: "type39"; data39: string; common: number }
  | { kind: "type40"; data40: string; common: number }
  | { kind: "type41"; data41: string; common: number }
  | { kind: "type42"; data42: string; common: number }
  | { kind: "type43"; data43: string; common: number }
  | { kind: "type44"; data44: string; common: number }
  | { kind: "type45"; data45: string; common: number }
  | { kind: "type46"; data46: string; common: number }
  | { kind: "type47"; data47: string; common: number }
  | { kind: "type48"; data48: string; common: number }
  | { kind: "type49"; data49: string; common: number };

function processEntity(e: Entity): string {
  switch (e.kind) {
    case "type0": return e.data0;
    case "type1": return e.data1;
    case "type2": return e.data2;
    case "type3": return e.data3;
    case "type4": return e.data4;
    case "type5": return e.data5;
    case "type6": return e.data6;
    case "type7": return e.data7;
    case "type8": return e.data8;
    case "type9": return e.data9;
    case "type10": return e.data10;
    case "type11": return e.data11;
    case "type12": return e.data12;
    case "type13": return e.data13;
    case "type14": return e.data14;
    case "type15": return e.data15;
    case "type16": return e.data16;
    case "type17": return e.data17;
    case "type18": return e.data18;
    case "type19": return e.data19;
    case "type20": return e.data20;
    case "type21": return e.data21;
    case "type22": return e.data22;
    case "type23": return e.data23;
    case "type24": return e.data24;
    case "type25": return e.data25;
    case "type26": return e.data26;
    case "type27": return e.data27;
    case "type28": return e.data28;
    case "type29": return e.data29;
    case "type30": return e.data30;
    case "type31": return e.data31;
    case "type32": return e.data32;
    case "type33": return e.data33;
    case "type34": return e.data34;
    case "type35": return e.data35;
    case "type36": return e.data36;
    case "type37": return e.data37;
    case "type38": return e.data38;
    case "type39": return e.data39;
    case "type40": return e.data40;
    case "type41": return e.data41;
    case "type42": return e.data42;
    case "type43": return e.data43;
    case "type44": return e.data44;
    case "type45": return e.data45;
    case "type46": return e.data46;
    case "type47": return e.data47;
    case "type48": return e.data48;
    case "type49": return e.data49;
    default: throw new Error("unreachable");
  }
}

function processWithIf(e: Entity): string {
  if (e.kind === "type0") return e.data0;
  if (e.kind === "type1") return e.data1;
  if (e.kind === "type2") return e.data2;
  if (e.kind === "type3") return e.data3;
  if (e.kind === "type4") return e.data4;
  if (e.kind === "type5") return e.data5;
  if (e.kind === "type6") return e.data6;
  if (e.kind === "type7") return e.data7;
  if (e.kind === "type8") return e.data8;
  if (e.kind === "type9") return e.data9;
  if (e.kind === "type10") return e.data10;
  if (e.kind === "type11") return e.data11;
  if (e.kind === "type12") return e.data12;
  if (e.kind === "type13") return e.data13;
  if (e.kind === "type14") return e.data14;
  if (e.kind === "type15") return e.data15;
  if (e.kind === "type16") return e.data16;
  if (e.kind === "type17") return e.data17;
  if (e.kind === "type18") return e.data18;
  if (e.kind === "type19") return e.data19;
  if (e.kind === "type20") return e.data20;
  if (e.kind === "type21") return e.data21;
  if (e.kind === "type22") return e.data22;
  if (e.kind === "type23") return e.data23;
  if (e.kind === "type24") return e.data24;
  if (e.kind === "type25") return e.data25;
  if (e.kind === "type26") return e.data26;
  if (e.kind === "type27") return e.data27;
  if (e.kind === "type28") return e.data28;
  if (e.kind === "type29") return e.data29;
  if (e.kind === "type30") return e.data30;
  if (e.kind === "type31") return e.data31;
  if (e.kind === "type32") return e.data32;
  if (e.kind === "type33") return e.data33;
  if (e.kind === "type34") return e.data34;
  if (e.kind === "type35") return e.data35;
  if (e.kind === "type36") return e.data36;
  if (e.kind === "type37") return e.data37;
  if (e.kind === "type38") return e.data38;
  if (e.kind === "type39") return e.data39;
  if (e.kind === "type40") return e.data40;
  if (e.kind === "type41") return e.data41;
  if (e.kind === "type42") return e.data42;
  if (e.kind === "type43") return e.data43;
  if (e.kind === "type44") return e.data44;
  if (e.kind === "type45") return e.data45;
  if (e.kind === "type46") return e.data46;
  if (e.kind === "type47") return e.data47;
  if (e.kind === "type48") return e.data48;
  if (e.kind === "type49") return e.data49;
  return processEntity(e);
}