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()));
        }
 }

Reply via email to