Skip to content

Optimization in the LayerPacker class - #667

Merged
dvdoug merged 2 commits into
dvdoug:masterfrom
bram123:performance_layerpacker
Aug 4, 2026
Merged

Optimization in the LayerPacker class#667
dvdoug merged 2 commits into
dvdoug:masterfrom
bram123:performance_layerpacker

Conversation

@bram123

@bram123 bram123 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Added early return when there is no possible space in the layer.

Tests on my environment:

Before (Time: 11:09.402): PHPUnit 12.5.31 by Sebastian Bergmann and contributors. Runtime: PHP 8.3.32

............................................................. 61 / 5151 ( 1%)
............................................................. 122 / 5151 ( 2%)
............................................................. 183 / 5151 ( 3%)
............................................................. 244 / 5151 ( 4%)
............................................................. 305 / 5151 ( 5%)
............................................................. 366 / 5151 ( 7%)
............................................................. 427 / 5151 ( 8%)
............................................................. 488 / 5151 ( 9%)
............................................................. 549 / 5151 ( 10%)
............................................................. 610 / 5151 ( 11%)
............................................................. 671 / 5151 ( 13%)
............................................................. 732 / 5151 ( 14%)
............................................................. 793 / 5151 ( 15%)
............................................................. 854 / 5151 ( 16%)
............................................................. 915 / 5151 ( 17%)
............................................................. 976 / 5151 ( 18%)
............................................................. 1037 / 5151 ( 20%)
............................................................. 1098 / 5151 ( 21%)
............................................................. 1159 / 5151 ( 22%)
............................................................. 1220 / 5151 ( 23%)
............................................................. 1281 / 5151 ( 24%)
............................................................. 1342 / 5151 ( 26%)
............................................................. 1403 / 5151 ( 27%)
............................................................. 1464 / 5151 ( 28%)
............................................................. 1525 / 5151 ( 29%)
............................................................. 1586 / 5151 ( 30%)
............................................................. 1647 / 5151 ( 31%)
............................................................. 1708 / 5151 ( 33%)
............................................................. 1769 / 5151 ( 34%)
............................................................. 1830 / 5151 ( 35%)
............................................................. 1891 / 5151 ( 36%)
............................................................. 1952 / 5151 ( 37%)
............................................................. 2013 / 5151 ( 39%)
............................................................. 2074 / 5151 ( 40%)
............................................................. 2135 / 5151 ( 41%)
............................................................. 2196 / 5151 ( 42%)
............................................................. 2257 / 5151 ( 43%)
............................................................. 2318 / 5151 ( 45%)
............................................................. 2379 / 5151 ( 46%)
............................................................. 2440 / 5151 ( 47%)
............................................................. 2501 / 5151 ( 48%)
............................................................. 2562 / 5151 ( 49%)
............................................................. 2623 / 5151 ( 50%)
............................................................. 2684 / 5151 ( 52%)
............................................................. 2745 / 5151 ( 53%)
............................................................. 2806 / 5151 ( 54%)
............................................................. 2867 / 5151 ( 55%)
............................................................. 2928 / 5151 ( 56%)
............................................................. 2989 / 5151 ( 58%)
............................................................. 3050 / 5151 ( 59%)
............................................................. 3111 / 5151 ( 60%)
............................................................. 3172 / 5151 ( 61%)
............................................................. 3233 / 5151 ( 62%)
............................................................. 3294 / 5151 ( 63%)
............................................................. 3355 / 5151 ( 65%)
............................................................. 3416 / 5151 ( 66%)
............................................................. 3477 / 5151 ( 67%)
............................................................. 3538 / 5151 ( 68%)
............................................................. 3599 / 5151 ( 69%)
............................................................. 3660 / 5151 ( 71%)
............................................................. 3721 / 5151 ( 72%)
............................................................. 3782 / 5151 ( 73%)
............................................................. 3843 / 5151 ( 74%)
............................................................. 3904 / 5151 ( 75%)
............................................................. 3965 / 5151 ( 76%)
............................................................. 4026 / 5151 ( 78%)
............................................................. 4087 / 5151 ( 79%)
............................................................. 4148 / 5151 ( 80%)
............................................................. 4209 / 5151 ( 81%)
............................................................. 4270 / 5151 ( 82%)
............................................................. 4331 / 5151 ( 84%)
.........................................S.SSS............... 4392 / 5151 ( 85%)
............................................................. 4453 / 5151 ( 86%)
............................................................. 4514 / 5151 ( 87%)
............................................................. 4575 / 5151 ( 88%)
............................................................. 4636 / 5151 ( 90%)
............................................................. 4697 / 5151 ( 91%)
............................................................. 4758 / 5151 ( 92%)
............................................................. 4819 / 5151 ( 93%)
............................................................. 4880 / 5151 ( 94%)
............................................................. 4941 / 5151 ( 95%)
............................................................. 5002 / 5151 ( 97%)
............................................................. 5063 / 5151 ( 98%)
............................................................. 5124 / 5151 ( 99%)
.......SSSSSS..S....SS..... 5151 / 5151 (100%)

Time: 11:09.402, Memory: 190.00 MB

There were 13 skipped tests:

  1. DVDoug\BoxPacker\PackerTest::testIssue334
  2. DVDoug\BoxPacker\PackerTest::testIssue275B
  3. DVDoug\BoxPacker\PackerTest::testIssue275C
  4. DVDoug\BoxPacker\PackerTest::testIssue275D
  5. DVDoug\BoxPacker\VolumePackerTest::testIssue214
  6. DVDoug\BoxPacker\VolumePackerTest::testIssue227
  7. DVDoug\BoxPacker\VolumePackerTest::testIssue230
  8. DVDoug\BoxPacker\VolumePackerTest::testIssue240
  9. DVDoug\BoxPacker\VolumePackerTest::testIssue264
  10. DVDoug\BoxPacker\VolumePackerTest::testIssue268
  11. DVDoug\BoxPacker\VolumePackerTest::testIssue366
  12. DVDoug\BoxPacker\VolumePackerTest::testIssue590
  13. DVDoug\BoxPacker\VolumePackerTest::testIssue609

OK, but some tests were skipped!
Tests: 5151, Assertions: 35366, Skipped: 13.

After (Time: 08:20.433): PHPUnit 12.5.31 by Sebastian Bergmann and contributors. Runtime: PHP 8.3.32

............................................................. 61 / 5151 ( 1%)
............................................................. 122 / 5151 ( 2%)
............................................................. 183 / 5151 ( 3%)
............................................................. 244 / 5151 ( 4%)
............................................................. 305 / 5151 ( 5%)
............................................................. 366 / 5151 ( 7%)
............................................................. 427 / 5151 ( 8%)
............................................................. 488 / 5151 ( 9%)
............................................................. 549 / 5151 ( 10%)
............................................................. 610 / 5151 ( 11%)
............................................................. 671 / 5151 ( 13%)
............................................................. 732 / 5151 ( 14%)
............................................................. 793 / 5151 ( 15%)
............................................................. 854 / 5151 ( 16%)
............................................................. 915 / 5151 ( 17%)
............................................................. 976 / 5151 ( 18%)
............................................................. 1037 / 5151 ( 20%)
............................................................. 1098 / 5151 ( 21%)
............................................................. 1159 / 5151 ( 22%)
............................................................. 1220 / 5151 ( 23%)
............................................................. 1281 / 5151 ( 24%)
............................................................. 1342 / 5151 ( 26%)
............................................................. 1403 / 5151 ( 27%)
............................................................. 1464 / 5151 ( 28%)
............................................................. 1525 / 5151 ( 29%)
............................................................. 1586 / 5151 ( 30%)
............................................................. 1647 / 5151 ( 31%)
............................................................. 1708 / 5151 ( 33%)
............................................................. 1769 / 5151 ( 34%)
............................................................. 1830 / 5151 ( 35%)
............................................................. 1891 / 5151 ( 36%)
............................................................. 1952 / 5151 ( 37%)
............................................................. 2013 / 5151 ( 39%)
............................................................. 2074 / 5151 ( 40%)
............................................................. 2135 / 5151 ( 41%)
............................................................. 2196 / 5151 ( 42%)
............................................................. 2257 / 5151 ( 43%)
............................................................. 2318 / 5151 ( 45%)
............................................................. 2379 / 5151 ( 46%)
............................................................. 2440 / 5151 ( 47%)
............................................................. 2501 / 5151 ( 48%)
............................................................. 2562 / 5151 ( 49%)
............................................................. 2623 / 5151 ( 50%)
............................................................. 2684 / 5151 ( 52%)
............................................................. 2745 / 5151 ( 53%)
............................................................. 2806 / 5151 ( 54%)
............................................................. 2867 / 5151 ( 55%)
............................................................. 2928 / 5151 ( 56%)
............................................................. 2989 / 5151 ( 58%)
............................................................. 3050 / 5151 ( 59%)
............................................................. 3111 / 5151 ( 60%)
............................................................. 3172 / 5151 ( 61%)
............................................................. 3233 / 5151 ( 62%)
............................................................. 3294 / 5151 ( 63%)
............................................................. 3355 / 5151 ( 65%)
............................................................. 3416 / 5151 ( 66%)
............................................................. 3477 / 5151 ( 67%)
............................................................. 3538 / 5151 ( 68%)
............................................................. 3599 / 5151 ( 69%)
............................................................. 3660 / 5151 ( 71%)
............................................................. 3721 / 5151 ( 72%)
............................................................. 3782 / 5151 ( 73%)
............................................................. 3843 / 5151 ( 74%)
............................................................. 3904 / 5151 ( 75%)
............................................................. 3965 / 5151 ( 76%)
............................................................. 4026 / 5151 ( 78%)
............................................................. 4087 / 5151 ( 79%)
............................................................. 4148 / 5151 ( 80%)
............................................................. 4209 / 5151 ( 81%)
............................................................. 4270 / 5151 ( 82%)
............................................................. 4331 / 5151 ( 84%)
.........................................S.SSS............... 4392 / 5151 ( 85%)
............................................................. 4453 / 5151 ( 86%)
............................................................. 4514 / 5151 ( 87%)
............................................................. 4575 / 5151 ( 88%)
............................................................. 4636 / 5151 ( 90%)
............................................................. 4697 / 5151 ( 91%)
............................................................. 4758 / 5151 ( 92%)
............................................................. 4819 / 5151 ( 93%)
............................................................. 4880 / 5151 ( 94%)
............................................................. 4941 / 5151 ( 95%)
............................................................. 5002 / 5151 ( 97%)
............................................................. 5063 / 5151 ( 98%)
............................................................. 5124 / 5151 ( 99%)
.......SSSSSS..S....SS..... 5151 / 5151 (100%)

Time: 08:20.433, Memory: 190.00 MB

There were 13 skipped tests:

  1. DVDoug\BoxPacker\PackerTest::testIssue334
  2. DVDoug\BoxPacker\PackerTest::testIssue275B
  3. DVDoug\BoxPacker\PackerTest::testIssue275C
  4. DVDoug\BoxPacker\PackerTest::testIssue275D
  5. DVDoug\BoxPacker\VolumePackerTest::testIssue214
  6. DVDoug\BoxPacker\VolumePackerTest::testIssue227
  7. DVDoug\BoxPacker\VolumePackerTest::testIssue230
  8. DVDoug\BoxPacker\VolumePackerTest::testIssue240
  9. DVDoug\BoxPacker\VolumePackerTest::testIssue264
  10. DVDoug\BoxPacker\VolumePackerTest::testIssue268
  11. DVDoug\BoxPacker\VolumePackerTest::testIssue366
  12. DVDoug\BoxPacker\VolumePackerTest::testIssue590
  13. DVDoug\BoxPacker\VolumePackerTest::testIssue609

OK, but some tests were skipped!
Tests: 5151, Assertions: 35366, Skipped: 13.

Here you can compare the execution times of all pullrequests: https://github.com/dvdoug/BoxPacker/actions?query=event%3Apull_request

bram123 and others added 2 commits July 23, 2026 10:22
Added early return when there is no possible space in the layer
Skip the recursive lengthwise fill when the just-packed item already defines the row length, instead of entering packLayer with zero free length. Matches the existing stackableDepth call-site guard.
@dvdoug

dvdoug commented Aug 4, 2026

Copy link
Copy Markdown
Owner

I've moved the check to make it easier to reason about, but thank you very much for finding this @bram123, that's a massive win

@dvdoug
dvdoug merged commit 7933191 into dvdoug:master Aug 4, 2026
48 of 49 checks passed
@bram123
bram123 deleted the performance_layerpacker branch August 4, 2026 14:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants