Commit 1db3088
committed
do_blocks(): Free up transient memory leak
There has been a memory inefficiency inside of `do_blocks()` where it
parses the given content then iterates through each top-level block to
render it. Unfortunately each top-level block can considerably add to
the overall memory use involved, and once moving on to the next
top-level block, all of the allocated memory will be retained until the
end of the call to `do_blocks()`.
In this change, each parsed block sub-tree is freed via reset to `null`
after it has been rendered. All top-level blocks are rendered
independently of each other and so this operation is safe — there are no
data dependencies between them.
For a test post of length 2.3 MB containing 138 top-level blocks, this
brought the minimum memory requirement for the PHP process down from
around 450 MB to around 316 MB. This was “around” since the memory
requirements are non-deterministic and some runs will succeed while
other runs will crash for out-of-memory given the same `memory_limit`.
Impact of this change will be most profound when there exist one or
more top-level blocks which allocate a significant amount of memory
which are not the last top-level-block in a post. This means that
this change might even impact small and typical posts, if the right
blocks are near the start of the post.
Developed in #8999
Discussed in https://core.trac.wordpress.org/ticket/63588
Props dmsnell, joemcgill.
Fixes #63588.
git-svn-id: https://develop.svn.wordpress.org/trunk@60316 602fd350-edb4-49c9-b593-d223f7449a821 parent c117d2d commit 1db3088
1 file changed
+6
-4
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2403 | 2403 | | |
2404 | 2404 | | |
2405 | 2405 | | |
2406 | | - | |
2407 | | - | |
| 2406 | + | |
| 2407 | + | |
| 2408 | + | |
2408 | 2409 | | |
2409 | | - | |
2410 | | - | |
| 2410 | + | |
| 2411 | + | |
| 2412 | + | |
2411 | 2413 | | |
2412 | 2414 | | |
2413 | 2415 | | |
| |||
0 commit comments