cuelang.org/go@v0.10.1/cue/testdata/benchmarks/mergeddisjunction.txtar (about) 1 // Here one comprehension creates a number of distinct values, each of which 2 // with a disjunction, then another comprehension maps them back to the 3 // same value, creating a large number of disjunctions. 4 // 5 // The disjunctions cannot be identified as equal in the general case. If no 6 // care is taken, disjunction elimination will be exponential, causing over 7 // a billion disjuncts to process in the below example. With the proper 8 // optimizations, there is a small, constant number of disjunction ops per 9 // disjunct. 10 // 11 // Issue #651 12 -- stats.txt -- 13 Leaks: 0 14 Freed: 283 15 Reused: 275 16 Allocs: 8 17 Retain: 0 18 19 Unifications: 99 20 Conjuncts: 530 21 Disjuncts: 283 22 23 -- in.cue -- 24 list: [ 25 0, 1, 2, 3, 4, 5, 6, 7, 8, 26 9, 10, 11, 12, 13, 14, 15, 16, 27 17, 18, 19, 20, 21, 22, 23, 24, 28 25, 26, 27, 28, 29, 30, 29 ] 30 a: [X=string]: text: *"default" | string 31 32 a: { 33 for i in list { 34 "\(i)": text: string 35 } 36 } 37 38 b: { 39 for x in a { 40 "\(x.text)": {text: x.text} 41 } 42 } 43 -- out/eval/stats -- 44 Leaks: 0 45 Freed: 283 46 Reused: 275 47 Allocs: 8 48 Retain: 0 49 50 Unifications: 99 51 Conjuncts: 530 52 Disjuncts: 283 53 -- out/eval -- 54 (struct){ 55 list: (#list){ 56 0: (int){ 0 } 57 1: (int){ 1 } 58 2: (int){ 2 } 59 3: (int){ 3 } 60 4: (int){ 4 } 61 5: (int){ 5 } 62 6: (int){ 6 } 63 7: (int){ 7 } 64 8: (int){ 8 } 65 9: (int){ 9 } 66 10: (int){ 10 } 67 11: (int){ 11 } 68 12: (int){ 12 } 69 13: (int){ 13 } 70 14: (int){ 14 } 71 15: (int){ 15 } 72 16: (int){ 16 } 73 17: (int){ 17 } 74 18: (int){ 18 } 75 19: (int){ 19 } 76 20: (int){ 20 } 77 21: (int){ 21 } 78 22: (int){ 22 } 79 23: (int){ 23 } 80 24: (int){ 24 } 81 25: (int){ 25 } 82 26: (int){ 26 } 83 27: (int){ 27 } 84 28: (int){ 28 } 85 29: (int){ 29 } 86 30: (int){ 30 } 87 } 88 a: (struct){ 89 "0": (struct){ 90 text: (string){ |(*(string){ "default" }, (string){ string }) } 91 } 92 "1": (struct){ 93 text: (string){ |(*(string){ "default" }, (string){ string }) } 94 } 95 "2": (struct){ 96 text: (string){ |(*(string){ "default" }, (string){ string }) } 97 } 98 "3": (struct){ 99 text: (string){ |(*(string){ "default" }, (string){ string }) } 100 } 101 "4": (struct){ 102 text: (string){ |(*(string){ "default" }, (string){ string }) } 103 } 104 "5": (struct){ 105 text: (string){ |(*(string){ "default" }, (string){ string }) } 106 } 107 "6": (struct){ 108 text: (string){ |(*(string){ "default" }, (string){ string }) } 109 } 110 "7": (struct){ 111 text: (string){ |(*(string){ "default" }, (string){ string }) } 112 } 113 "8": (struct){ 114 text: (string){ |(*(string){ "default" }, (string){ string }) } 115 } 116 "9": (struct){ 117 text: (string){ |(*(string){ "default" }, (string){ string }) } 118 } 119 "10": (struct){ 120 text: (string){ |(*(string){ "default" }, (string){ string }) } 121 } 122 "11": (struct){ 123 text: (string){ |(*(string){ "default" }, (string){ string }) } 124 } 125 "12": (struct){ 126 text: (string){ |(*(string){ "default" }, (string){ string }) } 127 } 128 "13": (struct){ 129 text: (string){ |(*(string){ "default" }, (string){ string }) } 130 } 131 "14": (struct){ 132 text: (string){ |(*(string){ "default" }, (string){ string }) } 133 } 134 "15": (struct){ 135 text: (string){ |(*(string){ "default" }, (string){ string }) } 136 } 137 "16": (struct){ 138 text: (string){ |(*(string){ "default" }, (string){ string }) } 139 } 140 "17": (struct){ 141 text: (string){ |(*(string){ "default" }, (string){ string }) } 142 } 143 "18": (struct){ 144 text: (string){ |(*(string){ "default" }, (string){ string }) } 145 } 146 "19": (struct){ 147 text: (string){ |(*(string){ "default" }, (string){ string }) } 148 } 149 "20": (struct){ 150 text: (string){ |(*(string){ "default" }, (string){ string }) } 151 } 152 "21": (struct){ 153 text: (string){ |(*(string){ "default" }, (string){ string }) } 154 } 155 "22": (struct){ 156 text: (string){ |(*(string){ "default" }, (string){ string }) } 157 } 158 "23": (struct){ 159 text: (string){ |(*(string){ "default" }, (string){ string }) } 160 } 161 "24": (struct){ 162 text: (string){ |(*(string){ "default" }, (string){ string }) } 163 } 164 "25": (struct){ 165 text: (string){ |(*(string){ "default" }, (string){ string }) } 166 } 167 "26": (struct){ 168 text: (string){ |(*(string){ "default" }, (string){ string }) } 169 } 170 "27": (struct){ 171 text: (string){ |(*(string){ "default" }, (string){ string }) } 172 } 173 "28": (struct){ 174 text: (string){ |(*(string){ "default" }, (string){ string }) } 175 } 176 "29": (struct){ 177 text: (string){ |(*(string){ "default" }, (string){ string }) } 178 } 179 "30": (struct){ 180 text: (string){ |(*(string){ "default" }, (string){ string }) } 181 } 182 } 183 b: (struct){ 184 default: (struct){ 185 text: (string){ |(*(string){ "default" }, (string){ string }) } 186 } 187 } 188 } 189 -- out/compile -- 190 --- in.cue 191 { 192 list: [ 193 0, 194 1, 195 2, 196 3, 197 4, 198 5, 199 6, 200 7, 201 8, 202 9, 203 10, 204 11, 205 12, 206 13, 207 14, 208 15, 209 16, 210 17, 211 18, 212 19, 213 20, 214 21, 215 22, 216 23, 217 24, 218 25, 219 26, 220 27, 221 28, 222 29, 223 30, 224 ] 225 a: { 226 [string]: { 227 text: (*"default"|string) 228 } 229 } 230 a: { 231 for _, i in 〈1;list〉 { 232 "\(〈1;i〉)": { 233 text: string 234 } 235 } 236 } 237 b: { 238 for _, x in 〈1;a〉 { 239 "\(〈1;x〉.text)": { 240 text: 〈2;x〉.text 241 } 242 } 243 } 244 }