[Spice-devel] [PATCH] improve performances comparing image pixels
Jonathon Jongsma
jjongsma at redhat.com
Fri Sep 4 01:49:04 PDT 2015
ACK, but a couple minor commit log nits
On Thu, 2015-09-03 at 16:48 +0100, Frediano Ziglio wrote:
> This patch contains a bit of small optimizations.
> It avoid booleans operations which could involve branches replacing
booleans -> boolean
> with binary operations (equal/all_ident -> some_differences).
Please update the above line to change "some_differences" to the new
name for this variable.
> The other optimization avoid the use of ABS. First the way the macro
avoid -> avoids
> was used (with a large expression) was not easy to optimize by the
> 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
compiler -> compilers
> of machine instructions (and a single compare).
>
> Using operf on same samples (using spice-server-replay) and trying 2 run
run -> runs
> I got
>
> run 1 2
> -------------------------
> before 104441 106267
> after 92387 91083
>
> So the performance increase is about 13%.
>
> 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 1c13ced..df13c81 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, any_different;
>
> - if (diff >= CONTRAST_TH) {
> + diff = GET_r(p1) - GET_r(p2);
> + any_different = 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);
> + any_different |= 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);
> + any_different |= diff;
> + if (CONTRASTING(diff)) {
> return 1;
> }
> - equal = equal && !diff;
>
> - if (equal) {
> + if (!any_different) {
> 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 any_different = 0;
> int cmp_res;
> cmp_res = FNAME(pixelcmp)(*line1, line1[1]);
> - all_ident = all_ident && (!cmp_res);
> - ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
> + any_different |= cmp_res;
> + ret = FNAME(PIX_PAIR_SCORE)[cmp_res];
> cmp_res = FNAME(pixelcmp)(*line1, *line2);
> - all_ident = all_ident && (!cmp_res);
> + any_different |= cmp_res;
> ret += FNAME(PIX_PAIR_SCORE)[cmp_res];
> cmp_res = FNAME(pixelcmp)(*line1, line2[1]);
> - all_ident = all_ident && (!cmp_res);
> + any_different |= 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 (!any_different) {
> + ret = 0;
> }
>
> return ret;
More information about the Spice-devel
mailing list