-
-
Notifications
You must be signed in to change notification settings - Fork 154
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Performance enhancements #202
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Removed some unnecessary initializers Memoized result is invalidated if fields used in its computation are mutated, therefore I made things final or static where possible to reduce potential for mutations that would invalidate it
…ic resulted in text overflowing cell
…cell; 8.4% faster with table of 4,000 colored cells
…oping over every cell (twice)
…ead of repeatedly building strings of spaces
…ary setNonStrokingColor calls; 0.5% smaller PDF in Perf2
Thanks for this, amazing performance improvements! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Performance is about 16 times faster and produced PDFs are about 20%-30% smaller. Also fixes 2 bugs.
Performance comparisons are based on two benchmarks I created: "Perf" generates 500 rows by 10 columns of cells with random text with a mix of line breaking point characters and varying lengths. It uses only text with no color or border styling. Perf is 15 times faster and generated a 28% smaller PDF with these enhancements. "Perf2" generates 500 rows of 8 columns with numbered and bulleted lists, italic and bold fonts, fill colors, and border styles. Perf2 is 17 times faster and generated a 20% smaller PDF. A variant of Perf2 with all rotated cells generated a 41% smaller PDF. The benchmark classes are in a separate branch, "benchmarks", which is not part of the pull request but provided for reference.
Most of the performance gains are from optimizing slow code paths. Also the rendering process avoids writing a lot of unnecessary operations to the PDF content stream.
One bug fixed was using the incorrect font style to calculate text width resulting in incorrect wrap points and text overflowing into adjacent cells. The other fix was the loss of text color setting with bullet lists.
I've run all the test PDFs and found them to be identical to the original code.
If you would like to discuss the changes or need me to break down the PR please let me know.