This is an automated email from the ASF dual-hosted git repository. mboehm7 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/systemml.git
The following commit(s) were added to refs/heads/master by this push: new 6f44461 [MINOR] Performance lineage tracing of literal operands 6f44461 is described below commit 6f44461692b5e3eea2a1554425ce6228ae4ddea2 Author: Matthias Boehm <mboe...@gmail.com> AuthorDate: Sat May 23 00:02:00 2020 +0200 [MINOR] Performance lineage tracing of literal operands This patch makes a minor performance improvement reuse thread-local string builders (as done for instructions) for the construction for lineage literals as well. On the following reduced example script, this patch improved the total execution time from 56s to 50.3s due to partially removed garbage collection overhead: X = rand(rows=10, cols=10, seed=1); for(i in 1:1e6) { tmp1 = ((X + 1) * 2) / 3 tmp2 = (tmp1 - 1) * tmp1 X = tmp2; if( i%%1e5==0 ) print("Iteration "+i); } print(sum(X)); Notice that this script creates over one million lineage items for literals to cover the 1e6 distinct values of the loop variable i. --- .../runtime/controlprogram/IfProgramBlock.java | 12 ++++------- .../runtime/instructions/InstructionUtils.java | 19 +++++++++--------- .../sysds/runtime/instructions/cp/CPOperand.java | 23 +++++++--------------- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/apache/sysds/runtime/controlprogram/IfProgramBlock.java b/src/main/java/org/apache/sysds/runtime/controlprogram/IfProgramBlock.java index 9d0d58e..94ec8e1 100644 --- a/src/main/java/org/apache/sysds/runtime/controlprogram/IfProgramBlock.java +++ b/src/main/java/org/apache/sysds/runtime/controlprogram/IfProgramBlock.java @@ -95,10 +95,8 @@ public class IfProgramBlock extends ProgramBlock ec.getLineagePath().setBranchPredicateValue(predResult.getBooleanValue()); //execute if statement - if(predResult.getBooleanValue()) - { - try - { + if(predResult.getBooleanValue()) { + try { for (int i=0 ; i < _childBlocksIfBody.size() ; i++) { _childBlocksIfBody.get(i).execute(ec); } @@ -106,13 +104,11 @@ public class IfProgramBlock extends ProgramBlock catch(DMLScriptException e) { throw e; } - catch(Exception e) - { + catch(Exception e) { throw new DMLRuntimeException(this.printBlockErrorLocation() + "Error evaluating if statement body ", e); } } - else - { + else { try { for (int i=0 ; i < _childBlocksElseBody.size() ; i++) { _childBlocksElseBody.get(i).execute(ec); diff --git a/src/main/java/org/apache/sysds/runtime/instructions/InstructionUtils.java b/src/main/java/org/apache/sysds/runtime/instructions/InstructionUtils.java index 740d821..1401bfa 100644 --- a/src/main/java/org/apache/sysds/runtime/instructions/InstructionUtils.java +++ b/src/main/java/org/apache/sysds/runtime/instructions/InstructionUtils.java @@ -955,24 +955,25 @@ public class InstructionUtils if( operand >= parts.length ) throw new DMLRuntimeException("Operand position " + operand + " exceeds the length of the instruction."); - //replace and reconstruct string parts[operand] = newValue; - StringBuilder sb = new StringBuilder(instStr.length()); - sb.append(parts[0]); - for( int i=1; i<parts.length; i++ ) { - sb.append(Lop.OPERAND_DELIMITOR); - sb.append(parts[i]); - } - return sb.toString(); + return concatOperands(parts); } public static String concatOperands(String... inputs) { + return concatOperandsWithDelim(Lop.OPERAND_DELIMITOR, inputs); + } + + public static String concatOperandParts(String... inputs) { + return concatOperandsWithDelim(Instruction.VALUETYPE_PREFIX, inputs); + } + + private static String concatOperandsWithDelim(String delim, String... inputs) { StringBuilder sb = _strBuilders.get(); sb.setLength(0); //reuse allocated space for( int i=0; i<inputs.length-1; i++ ) { sb.append(inputs[i]); - sb.append(Lop.OPERAND_DELIMITOR); + sb.append(delim); } sb.append(inputs[inputs.length-1]); return sb.toString(); diff --git a/src/main/java/org/apache/sysds/runtime/instructions/cp/CPOperand.java b/src/main/java/org/apache/sysds/runtime/instructions/cp/CPOperand.java index be46930..f349022 100644 --- a/src/main/java/org/apache/sysds/runtime/instructions/cp/CPOperand.java +++ b/src/main/java/org/apache/sysds/runtime/instructions/cp/CPOperand.java @@ -25,6 +25,7 @@ import org.apache.sysds.common.Types.DataType; import org.apache.sysds.common.Types.ValueType; import org.apache.sysds.runtime.DMLRuntimeException; import org.apache.sysds.runtime.instructions.Instruction; +import org.apache.sysds.runtime.instructions.InstructionUtils; public class CPOperand @@ -161,24 +162,14 @@ public class CPOperand } public String getLineageLiteral() { - StringBuilder sb = new StringBuilder(getName()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(getDataType().toString()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(getValueType().toString()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(isLiteral()); - return sb.toString(); + return InstructionUtils.concatOperandParts( + getName(), getDataType().name(), + getValueType().name(), String.valueOf(isLiteral())); } public String getLineageLiteral(ScalarObject so) { - StringBuilder sb = new StringBuilder(so.toString()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(getDataType().toString()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(getValueType().toString()); - sb.append(Instruction.VALUETYPE_PREFIX); - sb.append(isLiteral()); - return sb.toString(); + return InstructionUtils.concatOperandParts( + so.toString(), getDataType().name(), + getValueType().name(), String.valueOf(isLiteral())); } }