From: Richard Kreckel Date: Thu, 5 Nov 2015 12:41:18 +0000 (+0100) Subject: Add some minor optimizations. X-Git-Tag: ginac_1-6-6~10 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=c323cd8d5b0386ffb3d23456d97dfdafec6bbc2c Add some minor optimizations. --- diff --git a/ginac/add.cpp b/ginac/add.cpp index 9110491e..d66133eb 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -344,7 +344,7 @@ ex add::coeff(const ex & s, int n) const ex add::eval(int level) const { std::auto_ptr evaled_seqp = evalchildren(level); - if (evaled_seqp.get()) { + if (unlikely(evaled_seqp.get() != 0)) { // do more evaluation later return (new add(evaled_seqp, overall_coeff))-> setflag(status_flags::dynallocated); diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 9ef8afa9..b29f3802 100644 --- a/ginac/expairseq.cpp +++ b/ginac/expairseq.cpp @@ -32,6 +32,7 @@ #include "utils.h" #include "hash_seed.h" #include "indexed.h" +#include "compiler.h" #include #if EXPAIRSEQ_USE_HASHTAB @@ -1610,7 +1611,7 @@ std::auto_ptr expairseq::evalchildren(int level) const // returns a pointer to a newly created epvector otherwise // (which has to be deleted somewhere else) - if (level==1) + if (likely(level==1)) return std::auto_ptr(0); if (level == -max_recursion_level) diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 2b404877..636c939f 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -497,7 +497,7 @@ ex mul::coeff(const ex & s, int n) const ex mul::eval(int level) const { std::auto_ptr evaled_seqp = evalchildren(level); - if (evaled_seqp.get()) { + if (unlikely(evaled_seqp.get() != 0)) { // do more evaluation later return (new mul(evaled_seqp, overall_coeff))-> setflag(status_flags::dynallocated); diff --git a/ginac/power.cpp b/ginac/power.cpp index bf72d973..28e5bd3a 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -1215,7 +1215,6 @@ ex power::expand_add(const add & a, int n, unsigned options) const numeric factor = coeff; for (unsigned i = 0; i < exponent.size(); ++i) { const ex & r = a.seq[i].rest; - const ex & c = a.seq[i].coeff; GINAC_ASSERT(!is_exactly_a(r)); GINAC_ASSERT(!is_exactly_a(r) || !is_exactly_a(ex_to(r).exponent) || @@ -1223,15 +1222,19 @@ ex power::expand_add(const add & a, int n, unsigned options) const !is_exactly_a(ex_to(r).basis) || !is_exactly_a(ex_to(r).basis) || !is_exactly_a(ex_to(r).basis)); + GINAC_ASSERT(is_exactly_a(a.seq[i].coeff)); + const numeric & c = ex_to(a.seq[i].coeff); if (exponent[i] == 0) { // optimize away } else if (exponent[i] == 1) { // optimized term.push_back(r); - factor = factor.mul(ex_to(c)); + if (c != *_num1_p) + factor = factor.mul(c); } else { // general case exponent[i] > 1 term.push_back((new power(r, exponent[i]))->setflag(status_flags::dynallocated)); - factor = factor.mul(ex_to(c).power(exponent[i])); + if (c != *_num1_p) + factor = factor.mul(c.power(exponent[i])); } } result.push_back(a.combine_ex_with_coeff_to_pair(mul(term).expand(options), factor));