gmpxx patch: remove some copying
Marc Glisse
marc.glisse at normalesup.org
Tue Sep 2 18:20:39 CEST 2008
Hello,
a small (3 lines) patch proposition and associated changelog entry. This
is a performance patch, so not for 4.2.*.
* gmpxx.h (__gmp_set_expr): Remove useless copy in assignment of
integer expr to rational.
* gmpxx.h: Evaluate unary operations in-place for compound
expressions.
The first part depends on the recent __gmp_set_expr fix I sent (this is
actually how I discovered the issue).
Description:
1) to assign an expression that yields an integer to a rational, the
current code computes the integer in a temporary and assigns it to the
rational. I change this to compute the integer in the numerator of the
rational (and set the denominator to 1). This means one less copy.
2) to compute a=-(c+d), the current code does temp=c+d, a=-temp. I change
it to a=c+d, a=-a (in-place operation). As far as I can see, sqrt is the
only function which is slower in-place, and I don't think it is worth
making a special case for it. I am not changing the mpf case because it
might interfere with the way the precision is set (I am not sure so I
don't want to take risks).
Any comment?
--
Marc Glisse
-------------- next part --------------
--- /home/glisse/aout/gmpxx.h 2008-08-01 16:44:18.000000000 +0200
+++ gmpxx.h 2008-09-01 15:16:13.000000000 +0200
@@ -2158,8 +2158,8 @@
template <class T>
inline void __gmp_set_expr(mpq_ptr q, const __gmp_expr<mpz_t, T> &expr)
{
- mpz_class temp(expr);
- mpq_set_z(q, temp.get_mpz_t());
+ expr.eval(mpq_numref(q));
+ mpz_set_ui(mpq_denref(q),1);
}
template <>
@@ -2274,10 +2274,10 @@
public:
__gmp_expr(const val_type &val) : expr(val) { }
void eval(typename __gmp_resolve_expr<T>::ptr_type p) const
- { __gmp_expr<T, T> temp(expr.val); Op::eval(p, temp.__get_mp()); }
+ { expr.val.eval(p); Op::eval(p, p); }
void eval(typename __gmp_resolve_expr<T>::ptr_type p,
unsigned long int prec) const
{ __gmp_expr<T, T> temp(expr.val, prec); Op::eval(p, temp.__get_mp()); }
More information about the gmp-bugs
mailing list