Better JpegEncoder profiling & benchmarks #1534
Merged
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.
Prerequisites
Description
This is a test/benchmark only change.
Been playing around with
JpegEncoderto get some detailed data about our current performance numbers. In order to have proper profiler results (withPROFILINGconstant enabled), I had to change some of the[MethodImpl]attributes. Namely: switch to conditional inlining ([MethodImpl(InliningOptions.ShortMethod)]) in huffmann methods, and always inline inBlock8x8Findexer.Additionally:
EncodeJpegbenchmark to work with a bigger image, and moveMemoryStreamcreation to GlobalSetupJpegProfilingBenchmarks.EncodeJpeg_SingleMidSizeCurrent perf characteristics
(Updated) JpegEncoder benchmark results on my machine
Profiler results on my Surface Book
Running
EncodeJpeg_SingleMidSizewhich stresses encoding of the same image with default quality settings results in the following profile using dotTrace:This means that our current primary bottleneck is Huffmann encoding.