[es6] Optimize TypedArray.subarray()
authorkarl <karl@skomski.com>
Wed, 16 Sep 2015 16:21:33 +0000 (09:21 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 16 Sep 2015 16:21:55 +0000 (16:21 +0000)
````
var array = new Uint8Array(65000);
var startDate = Date.now();
var counter = 0;
while (counter++ < 50000000) {
  array.subarray(start, end);
}
var endDate = Date.now();
print(endDate - startDate);
````

4200 ms -> 3500 ms (16.67%)

BUG=

Review URL: https://codereview.chromium.org/1331993004

Cr-Commit-Position: refs/heads/master@{#30770}

src/macros.py
src/typedarray.js

index 6ea6d16..9f6a698 100644 (file)
@@ -157,6 +157,8 @@ macro TO_NAME(arg) = (%_ToName(arg));
 macro JSON_NUMBER_TO_STRING(arg) = ((%_IsSmi(%IS_VAR(arg)) || arg - arg == 0) ? %_NumberToString(arg) : "null");
 macro HAS_OWN_PROPERTY(arg, index) = (%_CallFunction(arg, index, ObjectHasOwnProperty));
 macro HAS_INDEX(array, index, is_array) = ((is_array && %_HasFastPackedElements(%IS_VAR(array))) ? (index < array.length) : (index in array));
+macro MAX_SIMPLE(argA, argB) = (argA < argB ? argB : argA);
+macro MIN_SIMPLE(argA, argB) = (argA < argB ? argA : argB);
 
 # Private names.
 macro IS_PRIVATE(sym) = (%SymbolIsPrivate(sym));
index 81fc13e..09bf7f6 100644 (file)
@@ -37,13 +37,9 @@ endmacro
 
 TYPED_ARRAYS(DECLARE_GLOBALS)
 
-var MathMax;
-var MathMin;
 var ToNumber;
 
 utils.Import(function(from) {
-  MathMax = from.MathMax;
-  MathMin = from.MathMin;
   ToNumber = from.ToNumber;
 });
 
@@ -210,25 +206,29 @@ function NAMESubArray(begin, end) {
   }
   var beginInt = TO_INTEGER(begin);
   if (!IS_UNDEFINED(end)) {
-    end = TO_INTEGER(end);
+    var endInt = TO_INTEGER(end);
+    var srcLength = %_TypedArrayGetLength(this);
+  } else {
+    var srcLength = %_TypedArrayGetLength(this);
+    var endInt = srcLength;
   }
 
-  var srcLength = %_TypedArrayGetLength(this);
   if (beginInt < 0) {
-    beginInt = MathMax(0, srcLength + beginInt);
+    beginInt = MAX_SIMPLE(0, srcLength + beginInt);
   } else {
-    beginInt = MathMin(srcLength, beginInt);
+    beginInt = MIN_SIMPLE(beginInt, srcLength);
   }
 
-  var endInt = IS_UNDEFINED(end) ? srcLength : end;
   if (endInt < 0) {
-    endInt = MathMax(0, srcLength + endInt);
+    endInt = MAX_SIMPLE(0, srcLength + endInt);
   } else {
-    endInt = MathMin(endInt, srcLength);
+    endInt = MIN_SIMPLE(endInt, srcLength);
   }
+
   if (endInt < beginInt) {
     endInt = beginInt;
   }
+
   var newLength = endInt - beginInt;
   var beginByteOffset =
       %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE;