You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/05/06 19:52:23 UTC

svn commit: r1742603 - /uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java

Author: schor
Date: Fri May  6 19:52:23 2016
New Revision: 1742603

URL: http://svn.apache.org/viewvc?rev=1742603&view=rev
Log:
[UIMA-4674] [UIMA-4897] move Misc to internal package, support tracing of FS creation and updates. remove redundant featurevalidationcheck from setStringValue.

Modified:
    uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java

Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java?rev=1742603&r1=1742602&r2=1742603&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/cas/impl/FeatureStructureImplC.java Fri May  6 19:52:23 2016
@@ -32,7 +32,7 @@ import org.apache.uima.cas.FeatureStruct
 import org.apache.uima.cas.SofaFS;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.impl.SlotKinds.SlotKind;
-import org.apache.uima.cas_data.impl.FeatureStructureImpl;
+import org.apache.uima.internal.util.Misc;
 import org.apache.uima.internal.util.StringUtils;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.cas.AnnotationBase;
@@ -49,7 +49,6 @@ import org.apache.uima.jcas.cas.ShortArr
 import org.apache.uima.jcas.cas.StringArray;
 import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.impl.JCasImpl;
-import org.apache.uima.util.Misc;
 
 /**
  * Feature structure implementation (for non JCas and JCas)
@@ -82,19 +81,55 @@ public class FeatureStructureImplC imple
 
   public static final String DISABLE_RUNTIME_FEATURE_RANGE_VALIDATION = "uima.disable_runtime_feature_range_validation";
   public static final boolean IS_ENABLE_RUNTIME_FEATURE_RANGE_VALIDATION  = !Misc.getNoValueSystemProperty(DISABLE_RUNTIME_FEATURE_RANGE_VALIDATION);
-
+  
+  private  static final boolean traceFSs = CASImpl.traceFSs;
+  
   public static final int IN_SET_SORTED_INDEX = 1;
+  
+  // next is for experiment of allocating multiple int arrays for different fss
+  
+//  //    3322 2222 2222 1111 1111 1100 0000 0000
+//  //    1098 7654 3210 9876 5432 1098 7654 3210
+//  //-------------------------------------------
+//  //    0000 0000 0001 1111 1111 1000 0000 0000   int offset mask
+//  //    0111 1111 1110 0000 0000 0000 0000 0000   ref offset mask
+//  
+//  private static final int bitMaskIntOffset = 0x001ff800;
+//  private static final int bitMaskRefOffset = 0x7fe00000;
+//  private static final int shiftIntOffset = 11;
+//  private static final int shiftRefOffset = 21;
+  
   // data storage
   // slots start with _ to prevent name collision with JCas style getters and setters.
   
-  protected final int[] _intData;  
-  protected final Object[] _refData;
+  /**
+   * Experiment:
+   *   goal: speed up allocation and maybe improve locality of reference
+   *         a) have _intData and _refData point to 
+   *             1) for array sizes < 256, a common shared array used with an offset
+   *             2) for array sizes > 256, individual arrays as is the previous design case
+   *             
+   *         b) have accesses use an offset kept in the flags; 
+   *            allocate in blocks of 1k
+   *              the larger, the less java object overhead per
+   *              the larger, the less "breakage" waste
+   *              the smaller, the better GC 
+   *            offset = 10 bits * 2 (one for int, one for ref)
+   *            
+   *   results: on 16-way processor (64 hyperthreaded cores), caused 2x slowdown, probably due to cache
+   *     contention.         
+   */
+  
+  private final int[] _intData;  
+  private final Object[] _refData;
   protected final int _id;  // a separate slot for access without loading _intData object
-  protected int flags = 0;  // a set of flags
+  private int _flags = 0;  // a set of flags
                             // bit 0 (least significant): fs is in one or more non-bag indexes
-                            // bits 1-31 reserved
+                            // bit 1-20 reserved
+                            // bits 21-30 ref offset
+                            // bits 11-20 int offset
+                            // bit 31 reserved
                            
-  
   /**
    * These next two object references are the same for every FS of this class created in one view.
    *   So, they could be stored in a shared object
@@ -108,9 +143,9 @@ public class FeatureStructureImplC imple
    * 
    * Also used to access other metadata including the type system
    */
-  protected final CASImpl _casView;  
+  public final CASImpl _casView;  
   
-  public final TypeImpl _typeImpl;
+  public TypeImpl _typeImpl;  // experiment : support switching the type
   
   // Called only to generate a dummy value for the REMOVED flag in bag indexes
 
@@ -143,13 +178,14 @@ public class FeatureStructureImplC imple
     _casView = casView;
     _typeImpl = type;
     
-    int c = _typeImpl.nbrOfUsedIntDataSlots;
-    _intData = (c == 0) ? null : new int[c];
-    
-    c = _typeImpl.nbrOfUsedRefDataSlots;
-    _refData = (c == 0) ? null : new Object[c];
+    _intData = _allocIntData();
+    _refData = _allocRefData();
+
+    _id = casView.setId2fs((TOP)this);   
     
-    _id = casView.setId2fs((TOP)this);    
+    if (traceFSs && !(this instanceof CommonArray)) {
+      _casView.traceFSCreate(this);
+    }
   }
 
   /**
@@ -166,13 +202,34 @@ public class FeatureStructureImplC imple
       throw new CASRuntimeException(CASRuntimeException.JCAS_TYPE_NOT_IN_CAS, this.getClass().getName());
     }
     
-    int c = _typeImpl.nbrOfUsedIntDataSlots;
-    _intData = (c == 0) ? null : new int[c];
-    
-    c = _typeImpl.nbrOfUsedRefDataSlots;
-    _refData = (c == 0) ? null : new Object[c];
+    _intData = _allocIntData();
+    _refData = _allocRefData();    
     
     _id = _casView.setId2fs((TOP)this); 
+
+    if (traceFSs && !(this instanceof CommonArray)) {
+      _casView.traceFSCreate(this);
+    }
+  }
+  
+  private int[] _allocIntData() {
+    final int c = _typeImpl.nbrOfUsedIntDataSlots;
+    if (c != 0) {
+//      _setIntDataArrayOffset(_casView.allocIntData(c));
+//      return _casView.getReturnIntDataForAlloc();
+      return new int[c];
+    } 
+    return null;    
+  }
+  
+  private Object[] _allocRefData() {
+    final int c = _typeImpl.nbrOfUsedRefDataSlots;
+    if (c != 0) {
+//      _setRefDataArrayOffset(_casView.allocRefData(c));
+//      return _casView.getReturnRefDataForAlloc();
+      return new Object[c];
+    } 
+    return null;    
   }
     
   /* ***********************
@@ -369,14 +426,18 @@ public class FeatureStructureImplC imple
 
   public void _setLongValueNfc(int adjOffset, long v) {
     FeatureImpl fi = _getFeatFromAdjOffset(adjOffset, true);
-    _casView.setLongValue(this, fi, v); 
+    _casView.setLongValue(this, fi, v);  // has trace call 
   }
   
   public void _setLongValueNcNj(FeatureImpl fi, long v) { _setLongValueNcNj(fi.getAdjustedOffset(), v); }
 
   public void _setLongValueNcNj(int adjOffset, long v) {
-    _intData[adjOffset] = (int)(v & 0xffffffff);
+//    final int offset = adjOffset + _getIntDataArrayOffset();  
+    _intData[adjOffset] = (int)v;  // narrowing cast discards all but lowest 32 bits; may change sign of value 
     _intData[adjOffset + 1] = (int)(v >> 32);
+    if (traceFSs) {
+      _casView.traceFSfeat(this, _getFeatFromAdjOffset(adjOffset, true), v);
+    }
   }
 
   @Override
@@ -385,11 +446,13 @@ public class FeatureStructureImplC imple
   protected void _setFloatValueNfc(int adjOffset, float v) { _setIntValueNfc(adjOffset, CASImpl.float2int(v)); }
 
   public void _setFloatValueNcNj(FeatureImpl fi, float v) {
-    _intData[fi.getAdjustedOffset()] = CASImpl.float2int(v);
+    _setIntValueCommon(fi, CASImpl.float2int(v));
+//    _intData[fi.getAdjustedOffset()] = CASImpl.float2int(v);
   }
 
   public void _setFloatValueNcNj(int adjOffset, float v) {
-    _intData[adjOffset] = CASImpl.float2int(v);
+    _setIntValueCommon(adjOffset, CASImpl.float2int(v));
+//    _intData[adjOffset] = CASImpl.float2int(v);
   }
 
   @Override
@@ -411,8 +474,8 @@ public class FeatureStructureImplC imple
 
   @Override
   public void setStringValue(Feature feat, String v) {
-    if (IS_ENABLE_RUNTIME_FEATURE_VALIDATION) featureValidation(feat);
-    if (IS_ENABLE_RUNTIME_FEATURE_VALUE_VALIDATION) featureValueValidation(feat, v);
+//    if (IS_ENABLE_RUNTIME_FEATURE_VALIDATION) featureValidation(feat);  // done by _setRefValueCJ
+    if (IS_ENABLE_RUNTIME_FEATURE_VALUE_VALIDATION) featureValueValidation(feat, v); // verifies feat can take a string
     subStringRangeCheck(feat, v);
     _setRefValueCJ((FeatureImpl) feat, v);
   }
@@ -420,7 +483,7 @@ public class FeatureStructureImplC imple
   public void _setStringValueNfc(int adjOffset, String v) {
     FeatureImpl fi = _getFeatFromAdjOffset(adjOffset, false);
     subStringRangeCheck(fi, v); 
-    _setRefValueCJ(fi, v);
+    _setRefValueNfcCJ(fi, v);
   }
 
   public void _setStringValueNcNj(FeatureImpl fi, String v) {
@@ -451,7 +514,7 @@ public class FeatureStructureImplC imple
       }
     }
     // no need to check for index corruption because fs refs can't be index keys
-    _refData[fi.getAdjustedOffset()] = v;
+    _setRefValueCommon(fi, v);
     _casView.maybeLogUpdate(this, fi);
   }
   
@@ -500,7 +563,8 @@ public class FeatureStructureImplC imple
       
     }
     if (IS_ENABLE_RUNTIME_FEATURE_VALIDATION) featureValidation(fi);
-    _casView.setWithCheckAndJournal((TOP)this, fi.getCode(), () -> _intData[fi.getAdjustedOffset()] = v); 
+    _casView.setWithCheckAndJournal((TOP)this, fi.getCode(), () -> _setIntValueCommon(fi, v)); 
+
   }
   
   /**
@@ -525,7 +589,7 @@ public class FeatureStructureImplC imple
    */
   protected void _setIntValueNfcCJ(int adjOffset, int v) {
     FeatureImpl fi = _getFeatFromAdjOffset(adjOffset, true);
-    _casView.setWithCheckAndJournal((TOP)this, fi, () -> _intData[adjOffset] = v); 
+    _casView.setWithCheckAndJournal((TOP)this, fi, () -> _setIntValueCommon(adjOffset, v));
   }
   
   /**
@@ -544,6 +608,7 @@ public class FeatureStructureImplC imple
     }
     if (IS_ENABLE_RUNTIME_FEATURE_VALIDATION) featureValidation(fi);
     _casView.setWithCheckAndJournal((TOP)this, fi.getCode(), () -> _setRefValueCommon(fi, v)); 
+  
   }
   
   /**
@@ -615,6 +680,7 @@ public class FeatureStructureImplC imple
      * When converting the lower 32 bits to a long, sign extension is done, so have to 
      * 0 out those bits before or-ing in the high order 32 bits.
      */
+//    final int offset = adjOffset + _getIntDataArrayOffset();
     return (((long)_intData[adjOffset]) & 0x00000000ffffffffL) | (((long)_intData[adjOffset + 1]) << 32); 
   }
   
@@ -646,7 +712,7 @@ public class FeatureStructureImplC imple
 
   public String _getStringValueNc(FeatureImpl feat) { return _getStringValueNc(feat.getAdjustedOffset()); }
 
-  public String _getStringValueNc(int adjOffset) { return (String) _refData[adjOffset]; }
+  public String _getStringValueNc(int adjOffset) { return (String) _refData[adjOffset /*+ _getRefDataArrayOffset()*/]; }
 
   @Override
   public TOP getFeatureValue(Feature feat) {
@@ -656,7 +722,7 @@ public class FeatureStructureImplC imple
   
   public TOP _getFeatureValueNc(FeatureImpl feat) { return _getFeatureValueNc(feat.getAdjustedOffset()); }
 
-  public TOP _getFeatureValueNc(int adjOffset) { return (TOP) _refData[adjOffset]; }
+  public TOP _getFeatureValueNc(int adjOffset) { return (TOP) _refData[adjOffset /*+ _getRefDataArrayOffset()*/]; }
  
   @Override
   public Object getJavaObjectValue(Feature feat) { 
@@ -1097,7 +1163,7 @@ public class FeatureStructureImplC imple
         return Long.toString(getLongValue(feat));
       case TypeSystemImpl.doubleTypeCode :
         return Double.toString(getDoubleValue(feat));
-      default: 
+      default: // byte, short, int, 
         return Integer.toString(getIntValue(feat));
       }
     }
@@ -1129,47 +1195,57 @@ public class FeatureStructureImplC imple
     return Integer.compare(this._id, o.id());
   }
   
-  protected boolean _inSetSortedIndex() { return (flags & IN_SET_SORTED_INDEX) != 0;}
-  protected void _setInSetSortedIndexed() { flags |= IN_SET_SORTED_INDEX; }
+  protected boolean _inSetSortedIndex() { return (_flags & IN_SET_SORTED_INDEX) != 0;}
+  protected void _setInSetSortedIndexed() { _flags |= IN_SET_SORTED_INDEX; }
   /**
    * All callers of this must insure fs is not indexed in **Any** View
    */
-  protected void _resetInSetSortedIndex() { flags &= ~IN_SET_SORTED_INDEX; }
+  protected void _resetInSetSortedIndex() { _flags &= ~IN_SET_SORTED_INDEX; }
   
   protected FeatureImpl _getFeatFromAdjOffset(int adjOffset, boolean isInInt) {
     return _typeImpl.getFeatureByAdjOffset(adjOffset, isInInt);
   }
   
   private int _getIntValueCommon(FeatureImpl feat) {
-    return _intData[feat.getAdjustedOffset()];
+    return _intData[feat.getAdjustedOffset() /*+ _getIntDataArrayOffset()*/];
   }
 
   private int _getIntValueCommon(int adjOffset) {
-    return _intData[adjOffset];
+    return _intData[adjOffset /*+ _getIntDataArrayOffset()*/];
   }
 
   private Object _getRefValueCommon(FeatureImpl feat) {
-    return _refData[feat.getAdjustedOffset()];
+    return _refData[feat.getAdjustedOffset() /*+ _getRefDataArrayOffset()*/];
   }
   
   public Object _getRefValueCommon(int adjOffset) {
-    return _refData[adjOffset];
+    return _refData[adjOffset /*+ _getRefDataArrayOffset()*/];
   }
    
   private void _setIntValueCommon(FeatureImpl fi, int v) {
-    _intData[fi.getAdjustedOffset()] = v;
+    _intData[fi.getAdjustedOffset() /*+ _getIntDataArrayOffset()*/] = v;
+    if (traceFSs) {
+      _casView.traceFSfeat(this, fi, v);
+    }
   }
   
   private void _setIntValueCommon(int adjOffset, int v) {
-    _intData[adjOffset] = v;
+    _intData[adjOffset /*+ _getIntDataArrayOffset()*/] = v;
+    if (traceFSs) {
+      _casView.traceFSfeat(this, _getFeatFromAdjOffset(adjOffset, true), v);
+    }
   }
 
   private void _setRefValueCommon(FeatureImpl fi, Object v) {
-    _refData[fi.getAdjustedOffset()] = v;
+    _setRefValueCommon(fi.getAdjustedOffset(), v);
   }
   
   public void  _setRefValueCommon(int adjOffset, Object v) {
-    _refData[adjOffset] = v;
+    _refData[adjOffset /*+ _getRefDataArrayOffset()*/] = v;
+    if (traceFSs) {
+      _casView.traceFSfeat(this, _getFeatFromAdjOffset(adjOffset, false), v);
+    }
+    
   }
 
   
@@ -1179,6 +1255,15 @@ public class FeatureStructureImplC imple
     _casView.maybeLogUpdate(this, fi);
   }
 
+//  private String getTraceRepOfObj(Object v) {
+//    if (v instanceof TOP) {
+//      TOP fs = (TOP) v;
+//      return fs._typeImpl.getShortName() + ':' + fs._id;
+//    } else {
+//      return (v == null) ? "null" : v.toString();
+//    }
+//  }
+  
   /*************************************
    *  Validation checking
    *************************************/
@@ -1261,10 +1346,16 @@ public class FeatureStructureImplC imple
    */
   public void _copyIntAndRefArraysFrom(FeatureStructureImplC src) {
     if (src._intData != null && _intData != null) {
-      System.arraycopy(src._intData, 0, _intData, 0, Math.min(src._intData.length, _intData.length));
+//      System.arraycopy(src._intData, src._getIntDataArrayOffset(), _intData, _getIntDataArrayOffset(), 
+//          Math.min(src._typeImpl.nbrOfUsedIntDataSlots, _typeImpl.nbrOfUsedIntDataSlots));
+      System.arraycopy(src._intData, 0, _intData, 0, 
+          Math.min(src._intData.length, _intData.length));
      }
     if (src._refData != null && _refData != null) {
-      System.arraycopy(src._refData, 0, _refData, 0, Math.min(src._refData.length, _refData.length));
+//      System.arraycopy(src._refData, src._getRefDataArrayOffset(), _refData, _getRefDataArrayOffset(), 
+//          Math.min(src._typeImpl.nbrOfUsedRefDataSlots, _typeImpl.nbrOfUsedRefDataSlots));
+      System.arraycopy(src._refData, 0, _refData, 0, 
+          Math.min(src._refData.length, _refData.length));
     }
   }
  
@@ -1273,10 +1364,12 @@ public class FeatureStructureImplC imple
    */
   public void _copyIntAndRefArraysEqTypesFrom(FeatureStructureImplC src) {
     if (_intData != null) {
-      System.arraycopy(src._intData, 0, _intData, 0, _intData.length);
+//      System.arraycopy(src._intData, src._getIntDataArrayOffset(), _intData, _getIntDataArrayOffset(), _typeImpl.nbrOfUsedIntDataSlots);
+      System.arraycopy(src._intData, 0, _intData, 0, _typeImpl.nbrOfUsedIntDataSlots);
      }
     if (_refData != null) {
-      System.arraycopy(src._refData, 0, _refData, 0, _refData.length);
+//      System.arraycopy(src._refData, src._getRefDataArrayOffset(), _refData, _getRefDataArrayOffset(), _typeImpl.nbrOfUsedRefDataSlots);
+      System.arraycopy(src._refData, 0, _refData, 0, _typeImpl.nbrOfUsedRefDataSlots);
     }
   }
 
@@ -1288,5 +1381,25 @@ public class FeatureStructureImplC imple
       System.arraycopy(src._intData, 0, _intData, 0, _intData.length);
      }
   }
+  
+  public String toShortString() {
+    return new StringBuilder(_typeImpl.getShortName()).append(':').append(_id).toString();   
+  }
+  
+//  private int _getIntDataArrayOffset() {
+//    return (_flags & bitMaskIntOffset) >> shiftIntOffset;
+//  }
+//  
+//  private void _setIntDataArrayOffset(int v) {
+//    _flags = (_flags & ~bitMaskIntOffset) | v << shiftIntOffset;
+//  }
+//  
+//  private int _getRefDataArrayOffset() {
+//    return _flags >> shiftRefOffset;
+//  }
+//  
+//  private void _setRefDataArrayOffset(int v) {
+//    _flags = (_flags & ~bitMaskRefOffset) | v << shiftRefOffset;
+//  }
 
 }
\ No newline at end of file