Commit 33da350
Optimize CEL PrattParser and Lexer performance
Improve parsing throughput and reduce memory allocations across CEL expressions.
Measured with CelParserBenchmark (parseOnly, built -c opt), comparing three
parsers back to back in one session: ANTLR, the Pratt parser before this change,
and the Pratt parser after it.
Objects allocated per parse:
| Case | ANTLR | Pratt before | Pratt after | Pratt vs ANTLR | Delta this CL |
| :--- | ---: | ---: | ---: | ---: | ---: |
| SMOKE_TEST | 357 | 131 | 123 | 2.9x smaller | -6.1% |
| CHAINED_ORS | 968 | 374 | 350 | 2.8x smaller | -6.4% |
| LIST_COMPREHENSION | 512 | 218 | 166 | 3.1x smaller | -23.9% |
| MESSAGE_CREATION | 1,253 | 502 | 427 | 2.9x smaller | -14.9% |
| LONG_LIST | 81,794 | 19,310 | 19,271 | 4.2x smaller | -0.2% |
Bytes allocated per parse:
| Case | ANTLR | Pratt before | Pratt after | Pratt vs ANTLR | Delta this CL |
| :--- | ---: | ---: | ---: | ---: | ---: |
| SMOKE_TEST | 12,256 | 3,776 | 3,608 | 3.4x smaller | -4.4% |
| CHAINED_ORS | 32,160 | 10,288 | 9,864 | 3.3x smaller | -4.1% |
| LIST_COMPREHENSION | 17,320 | 6,120 | 4,736 | 3.7x smaller | -22.6% |
| MESSAGE_CREATION | 43,128 | 13,888 | 12,240 | 3.5x smaller | -11.9% |
| LONG_LIST | 2,907,488 | 553,160 | 568,080 | 5.1x smaller | +2.7% |
Wall clock, mean of 3 caliper trial medians:
| Case | ANTLR | Pratt before | Pratt after | Pratt vs ANTLR | Delta this CL |
| :--- | ---: | ---: | ---: | ---: | ---: |
| SMOKE_TEST | 4,940 ns | 733 ns | 692 ns | 7.1x faster | -5.7% |
| CHAINED_ORS | 14,641 ns | 2,090 ns | 2,041 ns | 7.2x faster | -2.3% |
| LIST_COMPREHENSION | 7,514 ns | 1,640 ns | 1,218 ns | 6.2x faster | -25.7% |
| MESSAGE_CREATION | 20,979 ns | 3,962 ns | 3,487 ns | 6.0x faster | -12.0% |
| LONG_LIST | 1,616,631 ns | 144,980 ns | 142,583 ns | 11.3x faster | -1.7% |
LONG_LIST is the one case that allocates slightly more than before. It is an
extreme outlier (1,000 list elements, ~20k objects per parse) and the +2.7% comes
from letting the positions map grow from its default capacity instead of
presizing it; presizing cost more on every other case, so the tradeoff is worth
it. The map is removed entirely later in this series.
PiperOrigin-RevId: 9801310701 parent abff7d1 commit 33da350
8 files changed
Lines changed: 395 additions & 255 deletions
File tree
- parser/src
- main/java/dev/cel/parser
- test
- java/dev/cel/parser
- resources
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
| 121 | + | |
121 | 122 | | |
122 | 123 | | |
123 | 124 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
33 | | - | |
34 | 32 | | |
35 | 33 | | |
36 | 34 | | |
| |||
98 | 96 | | |
99 | 97 | | |
100 | 98 | | |
| 99 | + | |
101 | 100 | | |
102 | 101 | | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
103 | 106 | | |
104 | 107 | | |
105 | 108 | | |
| 109 | + | |
106 | 110 | | |
107 | 111 | | |
108 | 112 | | |
| |||
149 | 153 | | |
150 | 154 | | |
151 | 155 | | |
| 156 | + | |
152 | 157 | | |
153 | 158 | | |
154 | 159 | | |
155 | 160 | | |
156 | 161 | | |
| 162 | + | |
157 | 163 | | |
158 | 164 | | |
159 | 165 | | |
160 | 166 | | |
161 | 167 | | |
| 168 | + | |
162 | 169 | | |
163 | | - | |
| 170 | + | |
164 | 171 | | |
165 | 172 | | |
166 | 173 | | |
167 | 174 | | |
168 | | - | |
169 | | - | |
170 | | - | |
171 | | - | |
172 | | - | |
173 | | - | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | 175 | | |
179 | 176 | | |
180 | | - | |
| 177 | + | |
181 | 178 | | |
182 | 179 | | |
183 | 180 | | |
| |||
283 | 280 | | |
284 | 281 | | |
285 | 282 | | |
286 | | - | |
287 | | - | |
288 | | - | |
289 | | - | |
290 | 283 | | |
291 | 284 | | |
292 | 285 | | |
| |||
381 | 374 | | |
382 | 375 | | |
383 | 376 | | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
384 | 381 | | |
385 | 382 | | |
386 | 383 | | |
| |||
391 | 388 | | |
392 | 389 | | |
393 | 390 | | |
394 | | - | |
| 391 | + | |
395 | 392 | | |
396 | 393 | | |
397 | 394 | | |
| |||
403 | 400 | | |
404 | 401 | | |
405 | 402 | | |
406 | | - | |
| 403 | + | |
407 | 404 | | |
408 | 405 | | |
409 | 406 | | |
| |||
414 | 411 | | |
415 | 412 | | |
416 | 413 | | |
417 | | - | |
| 414 | + | |
418 | 415 | | |
419 | 416 | | |
420 | 417 | | |
| |||
423 | 420 | | |
424 | 421 | | |
425 | 422 | | |
426 | | - | |
427 | | - | |
| 423 | + | |
| 424 | + | |
428 | 425 | | |
429 | 426 | | |
430 | 427 | | |
| |||
433 | 430 | | |
434 | 431 | | |
435 | 432 | | |
436 | | - | |
| 433 | + | |
437 | 434 | | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
438 | 442 | | |
439 | 443 | | |
440 | 444 | | |
441 | 445 | | |
442 | 446 | | |
443 | 447 | | |
444 | 448 | | |
445 | | - | |
446 | | - | |
447 | | - | |
448 | | - | |
449 | | - | |
450 | | - | |
451 | | - | |
452 | | - | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
453 | 452 | | |
454 | | - | |
| 453 | + | |
455 | 454 | | |
456 | 455 | | |
457 | 456 | | |
458 | | - | |
459 | | - | |
460 | | - | |
461 | | - | |
462 | | - | |
463 | | - | |
464 | | - | |
465 | | - | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
466 | 460 | | |
467 | | - | |
| 461 | + | |
468 | 462 | | |
469 | 463 | | |
470 | 464 | | |
| |||
486 | 480 | | |
487 | 481 | | |
488 | 482 | | |
489 | | - | |
| 483 | + | |
490 | 484 | | |
491 | 485 | | |
492 | 486 | | |
| |||
503 | 497 | | |
504 | 498 | | |
505 | 499 | | |
506 | | - | |
| 500 | + | |
507 | 501 | | |
508 | 502 | | |
509 | 503 | | |
510 | 504 | | |
511 | 505 | | |
512 | 506 | | |
513 | | - | |
| 507 | + | |
514 | 508 | | |
515 | 509 | | |
516 | 510 | | |
517 | 511 | | |
518 | 512 | | |
519 | | - | |
| 513 | + | |
520 | 514 | | |
521 | 515 | | |
522 | 516 | | |
| |||
527 | 521 | | |
528 | 522 | | |
529 | 523 | | |
530 | | - | |
| 524 | + | |
531 | 525 | | |
532 | 526 | | |
533 | 527 | | |
534 | 528 | | |
535 | 529 | | |
536 | 530 | | |
537 | | - | |
538 | | - | |
539 | | - | |
| 531 | + | |
540 | 532 | | |
541 | 533 | | |
542 | 534 | | |
| |||
556 | 548 | | |
557 | 549 | | |
558 | 550 | | |
559 | | - | |
| 551 | + | |
560 | 552 | | |
561 | 553 | | |
562 | 554 | | |
| |||
566 | 558 | | |
567 | 559 | | |
568 | 560 | | |
569 | | - | |
| 561 | + | |
570 | 562 | | |
571 | 563 | | |
572 | 564 | | |
573 | 565 | | |
574 | 566 | | |
575 | 567 | | |
576 | 568 | | |
577 | | - | |
| 569 | + | |
578 | 570 | | |
579 | 571 | | |
580 | 572 | | |
| |||
612 | 604 | | |
613 | 605 | | |
614 | 606 | | |
615 | | - | |
| 607 | + | |
616 | 608 | | |
617 | | - | |
| 609 | + | |
618 | 610 | | |
619 | 611 | | |
620 | 612 | | |
| |||
639 | 631 | | |
640 | 632 | | |
641 | 633 | | |
642 | | - | |
643 | | - | |
644 | | - | |
645 | | - | |
646 | | - | |
647 | | - | |
| 634 | + | |
| 635 | + | |
648 | 636 | | |
649 | 637 | | |
650 | 638 | | |
651 | 639 | | |
652 | 640 | | |
653 | 641 | | |
654 | 642 | | |
655 | | - | |
| 643 | + | |
656 | 644 | | |
657 | 645 | | |
0 commit comments