KDE/kdeedu/kstars/kstars

View: New views
1 Messages — Rating Filter:   Alert me  

KDE/kdeedu/kstars/kstars

by Khudyakov Alexey :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

SVN commit 1046739 by khudyakov:

 * Remove caching completely from dms class.

Profiling shows that caching is rather inefficient. Cached results are
rarely reused about 2/3 of time they are just thrown away. It increase
size of dms significantly (more than 3 times) which make it costly to pass
it by value or return from function.

Its removal has positive impact on speed. Not dramatic one but clearly
wisible. (about 10% perfomance win)

 * Add fast default constructor. Current default constructor is quite slow
which may cause some overhead.

 * Remove some commented cruft

CCMAIL: kstars-devel@...

 M  +0 -49     dms.cpp  
 M  +105 -130  dms.h  


--- trunk/KDE/kdeedu/kstars/kstars/dms.cpp #1046738:1046739
@@ -26,13 +26,11 @@
 
 void dms::setD( const double &x ) {
     D = x;
-    scDirty = true;
 }
 
 void dms::setD(const int &d, const int &m, const int &s, const int &ms) {
     D = (double)abs(d) + ((double)m + ((double)s + (double)ms/1000.)/60.)/60.;
     if (d<0) {D = -1.0*D;}
-    scDirty = true;
 }
 
 void dms::setH( const double &x ) {
@@ -42,12 +40,10 @@
 void dms::setH(const int &h, const int &m, const int &s, const int &ms) {
     D = 15.0*((double)abs(h) + ((double)m + ((double)s + (double)ms/1000.)/60.)/60.);
     if (h<0) {D = -1.0*D;}
-    scDirty = true;
 }
 
 void dms::setRadians( const double &Rad ) {
     setD( Rad/DegToRad );
-    scDirty = true;
 }
 
 bool dms::setFromString( const QString &str, bool isDeg ) {
@@ -203,52 +199,7 @@
     return hs;
 }
 
-const double& dms::sin( void ) const {
-    if ( scDirty ) {
-        double s,c;
-        SinCos( s, c );
-    }
 
-    return Sin;
-}
-
-const double& dms::cos( void ) const {
-    if ( scDirty ) {
-        double s,c;
-        SinCos( s, c );
-    }
-
-    return Cos;
-}
-
-void dms::SinCos( double &sina, double &cosa ) const {
-    /**We have two versions of this function.  One is ANSI standard, but
-     *slower.  The other is faster, but is GNU only.
-     *Using the __GLIBC_ and __GLIBC_MINOR_ constants to determine if the
-     * GNU extension sincos() is defined.
-     */
-
-    if ( scDirty ) {
-                #ifdef __GLIBC__
-                #if ( __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 && !defined(__UCLIBC__))
-        //GNU version
-        sincos( radians(), &Sin, &Cos );
-                #else
-        //For older GLIBC versions
-        Sin = ::sin( radians() );
-        Cos = ::cos( radians() );
- #endif
- #else
-        //ANSI-compliant version
-        Sin = ::sin( radians() );
-        Cos = ::cos( radians() );
- #endif
-        scDirty = false;
-    }
-    sina = Sin;
-    cosa = Cos;
-}
-
 const dms dms::reduce( void ) const {
     double a = D;
     while (a<0.0) {a += 360.0;}
--- trunk/KDE/kdeedu/kstars/kstars/dms.h #1046738:1046739
@@ -23,75 +23,71 @@
 #include <kdebug.h>
 
 /**@class dms
- *@short An angle, stored as degrees, but expressible in many ways.
- *@author Jason Harris
- *@version 1.0
- *
- *dms encapsulates an angle.  The angle is stored as a double,
- *equal to the value of the angle in degrees.  Methods are available
- *for setting/getting the angle as a floating-point measured in
- *Degrees or Hours, or as integer triplets (degrees, arcminutes,
- *arcseconds or hours, minutes, seconds).  There is also a method
- *to set the angle according to a radian value, and to return the
- *angle expressed in radians.  Finally, a SinCos() method computes
- *the sin and cosine of the angle.  Once computed, the sin and cos
- *values are stored, so that subsequent SinCos() calls will be faster.
-  */
+ * @short An angle, stored as degrees, but expressible in many ways.
+ * @author Jason Harris
+ * @version 1.0
+ *
+ * dms encapsulates an angle.  The angle is stored as a double,
+ * equal to the value of the angle in degrees.  Methods are available
+ * for setting/getting the angle as a floating-point measured in
+ * Degrees or Hours, or as integer triplets (degrees, arcminutes,
+ * arcseconds or hours, minutes, seconds).  There is also a method
+ * to set the angle according to a radian value, and to return the
+ * angle expressed in radians.  Finally, a SinCos() method computes
+ * the sin and cosine of the angle.
+ */
 class dms {
 public:
-    /**@short Default Constructor.
-     *
-     *Set the floating-point value of the angle according to the four integer arguments.
-     *@param d degree portion of angle (int).  Defaults to zero.
-     *@param m arcminute portion of angle (int).  Defaults to zero.
-     *@param s arcsecond portion of angle (int).  Defaults to zero.
-     *@param ms arcsecond portion of angle (int).  Defaults to zero.
-     */
-    explicit dms( const int &d=0, const int &m=0, const int &s=0, const int &ms=0 ) { setD( d, m, s, ms ); }
+    /** Default constructor. */
+    dms() : D(0) {}
 
+    /**@short Set the floating-point value of the angle according to the four integer arguments.
+     * @param d degree portion of angle (int).  Defaults to zero.
+     * @param m arcminute portion of angle (int).  Defaults to zero.
+     * @param s arcsecond portion of angle (int).  Defaults to zero.
+     * @param ms arcsecond portion of angle (int).  Defaults to zero.
+     */
+    explicit dms( const int &d, const int &m=0, const int &s=0, const int &ms=0 ) { setD( d, m, s, ms ); }
+
     /**@short Construct an angle from a double value.
-     *
-     *Creates an angle whose value in Degrees is equal to the argument.
-     *@param x angle expressed as a floating-point number (in degrees)
-     */
+     *
+     * Creates an angle whose value in Degrees is equal to the argument.
+     * @param x angle expressed as a floating-point number (in degrees)
+     */
     dms( const double &x ) { setD( x ); }
 
     /**@short Construct an angle from a string representation.
-     *
-     *Attempt to create the angle according to the string argument.  If the string
-     *cannot be parsed as an angle value, the angle is set to zero.
-     *
-     *@warning There is not an unambiguous notification that it failed to parse the string,
-     *since the string could have been a valid representation of zero degrees.
-     *If this is a concern, use the setFromString() function directly instead.
-     *
-     *@param s the string to parse as a dms value.
-     *@param isDeg if true, value is in degrees; if false, value is in hours.
-     *@sa setFromString()
-     */
+     *
+     * Attempt to create the angle according to the string argument.  If the string
+     * cannot be parsed as an angle value, the angle is set to zero.
+     *
+     * @warning There is not an unambiguous notification that it failed to parse the string,
+     * since the string could have been a valid representation of zero degrees.
+     * If this is a concern, use the setFromString() function directly instead.
+     *
+     * @param s the string to parse as a dms value.
+     * @param isDeg if true, value is in degrees; if false, value is in hours.
+     * @sa setFromString()
+     */
     explicit dms( const QString &s, bool isDeg=true ) { setFromString( s, isDeg ); }
 
-    /**Destructor (empty).
-     */
-    ~dms() {}
-
     /**@return integer degrees portion of the angle
-     */
+     */
     inline int degree() const { return int( D ) ; }
 
     /**@return integer arcminutes portion of the angle.
-     *@note an arcminute is 1/60 degree.
-     */
+     * @note an arcminute is 1/60 degree.
+     */
     int arcmin() const;
 
     /**@return integer arcseconds portion of the angle
-     *@note an arcsecond is 1/60 arcmin, or 1/3600 degree.
-     */
+     * @note an arcsecond is 1/60 arcmin, or 1/3600 degree.
+     */
     int arcsec() const;
 
     /**@return integer milliarcseconds portion of the angle
-     *@note a  milliarcsecond is 1/1000 arcsecond.
-     */
+     * @note a  milliarcsecond is 1/1000 arcsecond.
+     */
     int marcsec() const;
 
     /**@return angle in degrees expressed as a double.
@@ -221,75 +217,39 @@
     void set( const double &d ) { setD( d ); }
 
     /**@short Attempt to parse the string argument as a dms value, and set the dms object
-     *accordingly.
-     *@param s the string to be parsed as a dms value.  The string can be an int or
-     *floating-point value, or a triplet of values (d/h, m, s) separated by spaces or colons.
-     *@param isDeg if true, the value is in degrees.  Otherwise, it is in hours.
-     *@return true if sting was parsed successfully.  Otherwise, set the dms value
-     *to 0.0 and return false.
-     */
+     * accordingly.
+     * @param s the string to be parsed as a dms value.  The string can be an int or
+     * floating-point value, or a triplet of values (d/h, m, s) separated by spaces or colons.
+     * @param isDeg if true, the value is in degrees.  Otherwise, it is in hours.
+     * @return true if sting was parsed successfully.  Otherwise, set the dms value
+     * to 0.0 and return false.
+     */
     bool setFromString( const QString &s, bool isDeg=true );
 
-    //TODO: Either implement these operators, or delete the commented declarations
-    /**
-     *Addition operator.  Add two dms objects.
-     *@param d add to current angle
-     *@return sum of two angles, in a dms object
-     */
-    //  dms operator+ ( dms d );
-    /**
-     *Subtraction operator.  Subtract two dms objects.
-     *@param d subtract from current angle
-     *@return difference of two angles, in a dms object
-     */
-    //  dms operator- ( dms d );
-    /**
-     *Assignment operator.  Assign value of argument to current angle.
-     *I wanted to pass the argument by reference, but I couldn't figure
-     *out a good way to do it without generating an error or warning message.
-     *@param a dms object to get angle value from
-     *@return dms object, copy of argument.
-     */
-    //  dms operator= ( const dms a ) { return a; }
-    /**
-     *Assignment operator.  Assign value of argument to current angle.
-     *@param d floating-point number to get angle value from
-     *@return dms object, same value as argument.
-     */
-    //  dms operator= ( const double &d ) { return (dms( d )); }
-
     /**@short Compute Sine and Cosine of the angle simultaneously.
-     *On machines using glibc >= 2.1, calling SinCos() is somewhat faster
-     *than calling sin() and cos() separately.
-     *The values are returned through the arguments (passed by reference).
-     *The Sin and Cos values are stored internally; on subsequent calls
-     *to SinCos(), the stored values are returned directly (unless the
-     *angle's value has changed).
-     *@param s Sine of the angle
-     *@param c Cosine of the angle
-     *@sa sin() cos()
-     */
-    void SinCos( double &s, double &c ) const;
+     * On machines using glibc >= 2.1, calling SinCos() is somewhat faster
+     * than calling sin() and cos() separately.
+     * The values are returned through the arguments (passed by reference).
+     *
+     * @param s Sine of the angle
+     * @param c Cosine of the angle
+     * @sa sin() cos()
+     */
+    inline void SinCos( double &s, double &c ) const;
 
     /**@short Compute the Angle's Sine.
-     *
-     *If the Sine/Cosine values have already been computed, then this
-     *function simply returns the stored value.  Otherwise, it will compute
-     *and store the values first.
-     *@return the Sine of the angle.
-     *@sa cos()
-     */
-    const double& sin() const;
+     *
+     * @return the Sine of the angle.
+     * @sa cos()
+     */
+    double sin() const { return ::sin(D*DegToRad); }
 
     /**@short Compute the Angle's Cosine.
-     *
-     *If the Sine/Cosine values have already been computed, then this
-     *function simply returns the stored value.  Otherwise, it will compute
-     *and store the values first.
-     *@return the Cosine of the angle.
-     *@sa sin()
-     */
-    const double& cos() const;
+     *
+     * @return the Cosine of the angle.
+     * @sa sin()
+     */
+    double cos() const { return ::cos(D*DegToRad); }
 
     /**@short Express the angle in radians.
      * @return the angle in radians (double)
@@ -297,36 +257,36 @@
     double radians() const { return D*DegToRad; }
 
     /**@short Set angle according to the argument, in radians.
-     *
-     *This function converts the argument to degrees, then sets the angle
-     *with setD().
-     *@param a angle in radians
-     */
+     *
+     * This function converts the argument to degrees, then sets the angle
+     * with setD().
+     * @param a angle in radians
+     */
     void setRadians( const double &a );
 
     /**return the equivalent angle between 0 and 360 degrees.
-     *@warning does not change the value of the parent angle itself.
-     */
+     * @warning does not change the value of the parent angle itself.
+     */
     const dms reduce() const;
 
     /**@return a nicely-formatted string representation of the angle
-     *in degrees, arcminutes, and arcseconds.
-     */
+     * in degrees, arcminutes, and arcseconds.
+     */
     const QString toDMSString(const bool forceSign = false) const;
 
     /**@return a nicely-formatted string representation of the angle
-     *in hours, minutes, and seconds.
-     */
+     * in hours, minutes, and seconds.
+     */
     const QString toHMSString() const;
 
     /**PI is a const static member; it's public so that it can be used anywhere,
-     *as long as dms.h is included.
-     */
+     * as long as dms.h is included.
+     */
     static const double PI;
 
     /**DegToRad is a const static member equal to the number of radians in
-     *one degree (dms::PI/180.0).
-     */
+     * one degree (dms::PI/180.0).
+     */
     static const double DegToRad;
 
     /**@short Static function to create a DMS object from a QString.
@@ -347,9 +307,24 @@
 
 private:
     double D;
-
-    mutable double Sin, Cos;
-    mutable bool scDirty;
 };
 
+// Inline sincos
+inline void dms::SinCos(double& s, double& c) const {
+#ifdef __GLIBC__
+#if ( __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 && !defined(__UCLIBC__))
+    //GNU version
+    sincos( radians(), &s, &c );
+#else
+    //For older GLIBC versions
+    s = ::sin( radians() );
+    c = ::cos( radians() );
 #endif
+#else
+    //ANSI-compliant version
+    s = ::sin( radians() );
+    c = ::cos( radians() );
+#endif
+}
+
+#endif
_______________________________________________
Kstars-devel mailing list
Kstars-devel@...
https://mail.kde.org/mailman/listinfo/kstars-devel