[Spice-devel] [PATCH 2/3] improve performances comparing image pixels
Jonathon Jongsma
jjongsma at redhat.com
Thu Sep 3 06:04:14 PDT 2015
Out of curiosity, did you measure the performance impact of these
changes? If so, it would be nice to include this in the commit log.
Just a few minor terminology suggestions below
On Fri, 2015-08-21 at 10:57 +0100, Frediano Ziglio wrote:
> This patch contains a bit of small optimizations.
> It avoid booleans operations which could involve branches replacing
"booleans operations" -> boolean operations
> with binary operations (equal/all_ident -> some_differences).
> The other optimization avoid the use of ABS. First the way the macro
> was used (with a large expression) was not easy to optimizeby the
"optimizeby" -> "optimize by"
> compiler.
> Then instead of using ABS a much simpler range check is used so instead
> of (ABS(n) >= k) a ((n) <= -k || (n) >= k) is used. This looks small
> but modern compiler can translate this not in range check in a couple
> of machine instructions (and a single compare).
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
> server/red_bitmap_utils.h | 41 ++++++++++++++++++++---------------------
> 1 file changed, 20 insertions(+), 21 deletions(-)
>
> diff --git a/server/red_bitmap_utils.h b/server/red_bitmap_utils.h
> index 7e57a7b..bf82e79 100644
> --- a/server/red_bitmap_utils.h
> +++ b/server/red_bitmap_utils.h
> @@ -49,6 +49,7 @@
> #else
> #define CONTRAST_TH 8
> #endif
> +#define CONTRASTING(n) ((n) <= -CONTRAST_TH || (n) >= CONTRAST_TH)
>
>
> #define SAMPLE_JUMP 15
> @@ -62,29 +63,27 @@ static const double FNAME(PIX_PAIR_SCORE)[] = {
> // return 0 - equal, 1 - for contrast, 2 for no contrast (PIX_PAIR_SCORE is defined accordingly)
> static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2)
> {
> - int diff = ABS(GET_r(p1) - GET_r(p2));
> - int equal;
> + int diff, some_differents;
Since "different" is an adjective, it sounds strange as a plural. I'd
suggest dropping the 's'. Or maybe changing to "any_different".
>
> - if (diff >= CONTRAST_TH) {
> + diff = GET_r(p1) - GET_r(p2);
> + some_differents = diff;
> + if (CONTRASTING(diff)) {
> return 1;
> }
> - equal = !diff;
>
> - diff = ABS(GET_g(p1) - GET_g(p2));
> -
> - if (diff >= CONTRAST_TH) {
> + diff = GET_g(p1) - GET_g(p2);
> + some_differents |= diff;
> + if (CONTRASTING(diff)) {
> return 1;
> }
>
> - equal = equal && !diff;
> -
> - diff = ABS(GET_b(p1) - GET_b(p2));
> - if (diff >= CONTRAST_TH) {
> + diff = GET_b(p1) - GET_b(p2);
> + some_differents |= diff;
> + if (CONTRASTING(diff)) {
> return 1;
> }
> - equal = equal && !diff;
>
> - if (equal) {
> + if (!some_differents) {
> return 0;
> } else {
> return 2;
> @@ -93,22 +92,22 @@ static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2)
>
> static inline double FNAME(pixels_square_score)(PIXEL *line1, PIXEL *line2)
> {
> - double ret = 0.0;
> - int all_ident = TRUE;
> + double ret;
> + int some_differents = 0;
Same as previous comment.
> int cmp_res;
> cmp_res = FNAME(pixelcmp)(*line1, line1[1]);
> - all_ident = all_ident && (!cmp_res);
> - ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
> + some_differents |= cmp_res;
> + ret = FNAME(PIX_PAIR_SCORE)[cmp_res];
> cmp_res = FNAME(pixelcmp)(*line1, *line2);
> - all_ident = all_ident && (!cmp_res);
> + some_differents |= cmp_res;
> ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
> cmp_res = FNAME(pixelcmp)(*line1, line2[1]);
> - all_ident = all_ident && (!cmp_res);
> + some_differents |= cmp_res;
> ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
>
> // ignore squares where all pixels are identical
> - if (all_ident) {
> - ret -= (FNAME(PIX_PAIR_SCORE)[0]) * 3;
> + if (!some_differents) {
> + ret = 0;
> }
>
> return ret;
More information about the Spice-devel
mailing list