Browse Source

Expressions.evaluate (binary,unary,function): Avoid explicit boxing of Booleans, Integers and Doubles

During the evaluate calls, the code previously used 'new Boolean' and 'new
Integer' constructors for the result values. By removing these allocations
and simply letting Java take care of boxing the resulting primitive
values, the integrated caching of Java can avoid creating objects in a
lot of cases (always for Boolean, and often for Integers in a certain
range).

(adapted by Joachim Klein from https://github.com/prismmodelchecker/prism/pull/91)

Tag: performance
accumulation-v4.7
Steffen Märcker 8 years ago
committed by Joachim Klein
parent
commit
f1b70b679f
  1. 46
      prism/src/parser/ast/ExpressionBinaryOp.java
  2. 16
      prism/src/parser/ast/ExpressionFunc.java
  3. 6
      prism/src/parser/ast/ExpressionUnaryOp.java

46
prism/src/parser/ast/ExpressionBinaryOp.java

@ -147,69 +147,69 @@ public class ExpressionBinaryOp extends Expression
{ {
switch (op) { switch (op) {
case IMPLIES: case IMPLIES:
return new Boolean(!operand1.evaluateBoolean(ec) || operand2.evaluateBoolean(ec));
return !operand1.evaluateBoolean(ec) || operand2.evaluateBoolean(ec);
case IFF: case IFF:
return new Boolean(operand1.evaluateBoolean(ec) == operand2.evaluateBoolean(ec));
return operand1.evaluateBoolean(ec) == operand2.evaluateBoolean(ec);
case OR: case OR:
return new Boolean(operand1.evaluateBoolean(ec) || operand2.evaluateBoolean(ec));
return operand1.evaluateBoolean(ec) || operand2.evaluateBoolean(ec);
case AND: case AND:
return new Boolean(operand1.evaluateBoolean(ec) && operand2.evaluateBoolean(ec));
return operand1.evaluateBoolean(ec) && operand2.evaluateBoolean(ec);
case EQ: case EQ:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) == operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) == operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) == operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) == operand2.evaluateDouble(ec);
} }
case NE: case NE:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) != operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) != operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) != operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) != operand2.evaluateDouble(ec);
} }
case GT: case GT:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) > operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) > operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) > operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) > operand2.evaluateDouble(ec);
} }
case GE: case GE:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) >= operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) >= operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) >= operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) >= operand2.evaluateDouble(ec);
} }
case LT: case LT:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) < operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) < operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) < operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) < operand2.evaluateDouble(ec);
} }
case LE: case LE:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Boolean(operand1.evaluateInt(ec) <= operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) <= operand2.evaluateInt(ec);
} else { } else {
return new Boolean(operand1.evaluateDouble(ec) <= operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) <= operand2.evaluateDouble(ec);
} }
case PLUS: case PLUS:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Integer(operand1.evaluateInt(ec) + operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) + operand2.evaluateInt(ec);
} else { } else {
return new Double(operand1.evaluateDouble(ec) + operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) + operand2.evaluateDouble(ec);
} }
case MINUS: case MINUS:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Integer(operand1.evaluateInt(ec) - operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) - operand2.evaluateInt(ec);
} else { } else {
return new Double(operand1.evaluateDouble(ec) - operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) - operand2.evaluateDouble(ec);
} }
case TIMES: case TIMES:
if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) { if (operand1.getType() == TypeInt.getInstance() && operand2.getType() == TypeInt.getInstance()) {
return new Integer(operand1.evaluateInt(ec) * operand2.evaluateInt(ec));
return operand1.evaluateInt(ec) * operand2.evaluateInt(ec);
} else { } else {
return new Double(operand1.evaluateDouble(ec) * operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) * operand2.evaluateDouble(ec);
} }
case DIVIDE: case DIVIDE:
return new Double(operand1.evaluateDouble(ec) / operand2.evaluateDouble(ec));
return operand1.evaluateDouble(ec) / operand2.evaluateDouble(ec);
} }
throw new PrismLangException("Unknown binary operator", this); throw new PrismLangException("Unknown binary operator", this);
} }

16
prism/src/parser/ast/ExpressionFunc.java

@ -231,7 +231,7 @@ public class ExpressionFunc extends Expression
j = getOperand(i).evaluateInt(ec); j = getOperand(i).evaluateInt(ec);
iMin = (j < iMin) ? j : iMin; iMin = (j < iMin) ? j : iMin;
} }
return new Integer(iMin);
return iMin;
} else { } else {
dMin = getOperand(0).evaluateDouble(ec); dMin = getOperand(0).evaluateDouble(ec);
n = getNumOperands(); n = getNumOperands();
@ -239,7 +239,7 @@ public class ExpressionFunc extends Expression
d = getOperand(i).evaluateDouble(ec); d = getOperand(i).evaluateDouble(ec);
dMin = (d < dMin) ? d : dMin; dMin = (d < dMin) ? d : dMin;
} }
return new Double(dMin);
return dMin;
} }
} }
@ -266,7 +266,7 @@ public class ExpressionFunc extends Expression
j = getOperand(i).evaluateInt(ec); j = getOperand(i).evaluateInt(ec);
iMax = (j > iMax) ? j : iMax; iMax = (j > iMax) ? j : iMax;
} }
return new Integer(iMax);
return iMax;
} else { } else {
dMax = getOperand(0).evaluateDouble(ec); dMax = getOperand(0).evaluateDouble(ec);
n = getNumOperands(); n = getNumOperands();
@ -274,7 +274,7 @@ public class ExpressionFunc extends Expression
d = getOperand(i).evaluateDouble(ec); d = getOperand(i).evaluateDouble(ec);
dMax = (d > dMax) ? d : dMax; dMax = (d > dMax) ? d : dMax;
} }
return new Double(dMax);
return dMax;
} }
} }
@ -362,9 +362,9 @@ public class ExpressionFunc extends Expression
{ {
try { try {
if (type instanceof TypeInt) { if (type instanceof TypeInt) {
return new Integer(evaluatePowInt(getOperand(0).evaluateInt(ec), getOperand(1).evaluateInt(ec)));
return evaluatePowInt(getOperand(0).evaluateInt(ec), getOperand(1).evaluateInt(ec));
} else { } else {
return new Double(evaluatePowDouble(getOperand(0).evaluateDouble(ec), getOperand(1).evaluateDouble(ec)));
return evaluatePowDouble(getOperand(0).evaluateDouble(ec), getOperand(1).evaluateDouble(ec));
} }
} catch (PrismLangException e) { } catch (PrismLangException e) {
e.setASTElement(this); e.setASTElement(this);
@ -408,7 +408,7 @@ public class ExpressionFunc extends Expression
public Object evaluateMod(EvaluateContext ec) throws PrismLangException public Object evaluateMod(EvaluateContext ec) throws PrismLangException
{ {
try { try {
return new Integer(evaluateMod(getOperand(0).evaluateInt(ec), getOperand(1).evaluateInt(ec)));
return evaluateMod(getOperand(0).evaluateInt(ec), getOperand(1).evaluateInt(ec));
} catch (PrismLangException e) { } catch (PrismLangException e) {
e.setASTElement(this); e.setASTElement(this);
throw e; throw e;
@ -439,7 +439,7 @@ public class ExpressionFunc extends Expression
public Object evaluateLog(EvaluateContext ec) throws PrismLangException public Object evaluateLog(EvaluateContext ec) throws PrismLangException
{ {
try { try {
return new Double(evaluateLog(getOperand(0).evaluateDouble(ec), getOperand(1).evaluateDouble(ec)));
return evaluateLog(getOperand(0).evaluateDouble(ec), getOperand(1).evaluateDouble(ec));
} catch (PrismLangException e) { } catch (PrismLangException e) {
e.setASTElement(this); e.setASTElement(this);
throw e; throw e;

6
prism/src/parser/ast/ExpressionUnaryOp.java

@ -120,12 +120,12 @@ public class ExpressionUnaryOp extends Expression
{ {
switch (op) { switch (op) {
case NOT: case NOT:
return new Boolean(!operand.evaluateBoolean(ec));
return !operand.evaluateBoolean(ec);
case MINUS: case MINUS:
if (type instanceof TypeInt) { if (type instanceof TypeInt) {
return new Integer(-operand.evaluateInt(ec));
return -operand.evaluateInt(ec);
} else { } else {
return new Double(-operand.evaluateDouble(ec));
return -operand.evaluateDouble(ec);
} }
case PARENTH: case PARENTH:
return operand.evaluate(ec); return operand.evaluate(ec);

Loading…
Cancel
Save