[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-kimageshop
Subject:    [patch] on the performance of KisCircleMaskGenerator::valueAt
From:       Geoffry Song <goffrie () gmail ! com>
Date:       2010-12-24 4:00:40
Message-ID: AANLkTikEvLpQU52kZRtAwTx1m8Ah5HimewpbzJTWuLML () mail ! gmail ! com
[Download RAW message or body]

I noticed that KisCircleMaskGenerator::valueAt(), which can easily be
called millions of times in a single stroke, has some rather
inefficient code (in particular, an unnecessary sqrt()), so I took the
liberty of optimizing the code a bit. This patch should somewhat
improve the performance of large brushes, especially the sketch brush
with a large diameter. No, it is not a large difference.

On my machine, the old code took about 26 nanoseconds per call, and
the new code takes 15 nanoseconds per call.

(Raw data: old code, time per call: 2.6188e-08, 2.6148e-08, 2.612e-08,
2.6688e-08, 2.668e-08, 2.6868e-08. New code: 1.4952e-08, 1.5532e-08,
1.4972e-08, 1.4964e-08, 1.4892e-08, 1.4868e-08, 1.4876e-08,
1.5144e-08, 1.4872e-08, 1.4872e-08, 1.4876e-08. Each sample is an
average over 2.5 billion calls)


--
Segmentation fault

["0001-KisCircleMaskGenerator-valueAt-optimize-arithmetic.patch" (application/octet-stream)]

From e86101cdd84d664358217be8adcb42a09cbb4b18 Mon Sep 17 00:00:00 2001
From: Geoffry Song <goffrie@gmail.com>
Date: Thu, 23 Dec 2010 18:10:38 -0500
Subject: [PATCH] KisCircleMaskGenerator::valueAt(): optimize arithmetic

---
 krita/image/kis_circle_mask_generator.cpp |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/krita/image/kis_circle_mask_generator.cpp b/krita/image/kis_circle_mask_generator.cpp
index 2bcafee..585088e 100644
--- a/krita/image/kis_circle_mask_generator.cpp
+++ b/krita/image/kis_circle_mask_generator.cpp
@@ -71,26 +71,28 @@ quint8 KisCircleMaskGenerator::valueAt(qreal x, qreal y) const
     } else {
         qreal transformedFadeX = d->xfadecoef * softness();
         qreal transformedFadeY = d->yfadecoef * softness();
+        qreal transformedFadeXSquared = transformedFadeX * transformedFadeX;
+        qreal transformedFadeYSquared = transformedFadeY * transformedFadeY;
         
-        double normeFade = norme(xr * transformedFadeX, yr * transformedFadeY);
+        double xrSquared = xr * xr;
+        double yrSquared = yr * yr;
+        double normeFade = xrSquared * transformedFadeXSquared + yrSquared * transformedFadeYSquared;
         if (normeFade > 1) {
-            double xle, yle;
             // xle stands for x-coordinate limit exterior
             // yle stands for y-coordinate limit exterior
             // we are computing the coordinate on the external ellipse in order to compute
             // the fade value
-            if (xr == 0) {
-                xle = 0;
-                yle = yr > 0 ? 1 / d->ycoef : -1 / d->ycoef;
-            } else {
-                double c = yr / (double)xr;
-                xle = sqrt(1 / norme(d->xcoef, c * d->ycoef));
-                xle = xr > 0 ? xle : -xle;
-                yle = xle * c;
-            }
+
+            // xle = xr / sqrt(norme(xr * d->xcoef, yr * d->ycoef))
+            // yle = yr / sqrt(norme(xr * d->xcoef, yr * d->ycoef))
+
             // On the internal limit of the fade area, normeFade is equal to 1
-            double normeFadeLimitE = norme(xle * transformedFadeX, yle * transformedFadeY);
-            return (uchar)(255 *(normeFade - 1) / (normeFadeLimitE - 1));
+
+            // normeFadeLimitE = norme(xle * transformedFadeX, yle * transformedFadeY)
+            // return (uchar)(255 *(normeFade - 1) / (normeFadeLimitE - 1));
+
+            return (uchar)(255 * n * (normeFade - 1) / (normeFade - n));
+            // if n == 0, the conversion of NaN to uchar will correctly result in zero
         } else {
             n = 1 - n;
             if( width() < 2 || height() < 2 || n > d->xcoef * 0.5 || n > d->ycoef * 0.5)
-- 
1.7.3.4



_______________________________________________
kimageshop mailing list
kimageshop@kde.org
https://mail.kde.org/mailman/listinfo/kimageshop


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic