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 <[email protected]>
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()));
}
}