Conversation
|
FYI, I have not yet gone back through all my changes to add comments and perform a self-review, etc. |
|
By the way, I plan to attempt using ArrayPool for further optimizations but not in this PR. |
|
@codebude I think this PR has enough changes. The GitHub comparison should be reasonable enough to follow. I would like to follow up with some other PRs:
|
|
The benchmarks are updated in the PR description, showing 60-75% memory reduction and 100-400% speed increase. Notably, Gen1 collections have been reduced enough that BenchmarkDotNet has stopped listing them! Most likely further PRs will further reduce memory requirements, but not increase speed. |
|
I'm not planning to re-engineer the mathematics, like to use vector math or anything. While I'm sure it's possible, that's not my forte. |
Co-authored-by: Günther Foidl <gue@korporal.at>
Co-authored-by: Günther Foidl <gue@korporal.at>
Co-authored-by: Günther Foidl <gue@korporal.at>
Co-authored-by: Günther Foidl <gue@korporal.at>
Co-authored-by: Günther Foidl <gue@korporal.at>
|
Benchmarks updated. New test results shaved 10us (10%) from short test and 20us (1%) from long test. |
|
Eliminating |
But memory usage improved massively. :-) |
|
While all beneficial changes, the memory usage didn't change due to the arithmetic/ref/pointer changes; it measured as identical. The memory usage changes were due to |
gfoidl
left a comment
There was a problem hiding this comment.
A few nits, otherwise LGTM 👍🏻
This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [QRCoder](https://github.com/codebude/QRCoder) | `1.4.3` -> `1.6.0` | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>codebude/QRCoder (QRCoder)</summary> ### [`v1.6.0`](https://github.com/codebude/QRCoder/releases/tag/v1.6.0) #### What has changed - \[Enhancement] Huge performance (runtime and memory) optimization in `QrCodeGenerator` (PRs [#​509](Shane32/QRCoder#509), [#​519](Shane32/QRCoder#519), [#​520](Shane32/QRCoder#520), [#​521](Shane32/QRCoder#521), [#​524](Shane32/QRCoder#524), [#​530](Shane32/QRCoder#530), [#​532](Shane32/QRCoder#532)) - \[Enhancement] Big performance (runtime and memory) optimization in `BitmapByteQRCode` (PR [#​566](Shane32/QRCoder#566)) - \[Enhancement] Added ECC level mismatch detection when using payloads from payload generator (PR [#​526](Shane32/QRCoder#526)) - \[Enhancement] Implementation of encoding constraints (EccLevel, EciMode) in SwissQRCode and GiroCode payloads to enforce that the payloads comply with the specifications of the respective standards (PR [#​533](Shane32/QRCoder#533)) - \[Enhancement] Added support for trimming (`IsTrimmable` project property) (PR [#​539](Shane32/QRCoder#539)) - \[Enhancement] Added XML comments (code documentation) to all public members (PR [#​561](Shane32/QRCoder#561)) - \[Enhancement] Added new/third overload to `PngByteQRCode` that accepts colors as System.Drawing.Color (PR [#​564](Shane32/QRCoder#564)) - \[Enhancement] Updated the Bitmap header from BITMAPCOREHEADER to BITMAPINFOHEADER in `BitmapByteQRCode` (PR [#​565](Shane32/QRCoder#565)) - \[Refactoring] Restructured `QRCodeGenerator` classes into separate files and partially restructured code for better manageability (PRs [#​516](Shane32/QRCoder#516), [#​528](Shane32/QRCoder#528), [#​531](https://github....
System
Before
After
Notes
Most of the performance improvements in this PR fall into a few categories:
BitArrayinstead ofstringAddRange)Progress
So far about half the code has been converted to use
BitArray. There is still a notable amount of code that still uses strings that remains to be optimized. Also thePolynomclass/constructor is heavily used and should be optimized.