From: Richard Kreckel Date: Thu, 5 Nov 2015 12:41:18 +0000 (+0100) Subject: Add some minor optimizations. X-Git-Tag: release_1-7-0~7^2~65 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=2bf56ec52a7bed4ac3d02be8887b0287b5acd189 Add some minor optimizations. --- diff --git a/ginac/add.cpp b/ginac/add.cpp index 74c8d815..fd83de11 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -331,7 +331,7 @@ ex add::coeff(const ex & s, int n) const ex add::eval(int level) const { epvector evaled = evalchildren(level); - if (!evaled.empty()) { + if (unlikely(!evaled.empty())) { // do more evaluation later return (new add(std::move(evaled), overall_coeff))-> setflag(status_flags::dynallocated); diff --git a/ginac/expairseq.cpp b/ginac/expairseq.cpp index 67099f57..0e67ec9a 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 #include @@ -1053,7 +1054,7 @@ epvector expairseq::expandchildren(unsigned options) const * had to be changed. */ epvector expairseq::evalchildren(int level) const { - if (level==1) + if (likely(level==1)) return epvector(); // nothing had to be evaluated if (level == -max_recursion_level) diff --git a/ginac/mul.cpp b/ginac/mul.cpp index 943095bb..f8ddd9b2 100644 --- a/ginac/mul.cpp +++ b/ginac/mul.cpp @@ -469,7 +469,7 @@ ex mul::coeff(const ex & s, int n) const ex mul::eval(int level) const { epvector evaled = evalchildren(level); - if (!evaled.empty()) { + if (unlikely(!evaled.empty())) { // do more evaluation later return (new mul(std::move(evaled), overall_coeff))-> setflag(status_flags::dynallocated); diff --git a/ginac/power.cpp b/ginac/power.cpp index b2622d60..485fa06f 100644 --- a/ginac/power.cpp +++ b/ginac/power.cpp @@ -1207,7 +1207,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) || @@ -1215,15 +1214,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));