Skip to content
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 22 commits into from
Aug 29, 2020
Merged

Conversation

vobarian
Copy link
Contributor

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.

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
…cell; 8.4% faster with table of 4,000 colored cells
…ead of repeatedly building strings of spaces
…ary setNonStrokingColor calls; 0.5% smaller PDF in Perf2
@dhorions dhorions self-assigned this Aug 29, 2020
@dhorions dhorions merged commit 68931ad into dhorions:master Aug 29, 2020
@dhorions
Copy link
Owner

Thanks for this, amazing performance improvements!

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