lib: avoid .toLowerCase() call in Buffer#write()
authorBen Noordhuis <info@bnoordhuis.nl>
Wed, 4 Mar 2015 00:09:33 +0000 (01:09 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 5 Mar 2015 18:44:50 +0000 (19:44 +0100)
Avoid a costly String#toLowerCase() call in Buffer#write() in the
common case, i.e., that the string is already lowercase.  Reduces
the running time of the following benchmark by about 40%:

    for (var b = Buffer(1), i = 0; i < 25e6; ++i) b.write('x', 'ucs2');

PR-URL: https://github.com/iojs/io.js/pull/1048
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
lib/buffer.js

index ba832de..5427a5a 100644 (file)
@@ -480,47 +480,45 @@ Buffer.prototype.write = function(string, offset, length, encoding) {
   if (length === undefined || length > remaining)
     length = remaining;
 
-  encoding = !!encoding ? (encoding + '').toLowerCase() : 'utf8';
-
   if (string.length > 0 && (length < 0 || offset < 0))
     throw new RangeError('attempt to write outside buffer bounds');
 
-  var ret;
-  switch (encoding) {
-    case 'hex':
-      ret = this.hexWrite(string, offset, length);
-      break;
+  if (!encoding)
+    encoding = 'utf8';
 
-    case 'utf8':
-    case 'utf-8':
-      ret = this.utf8Write(string, offset, length);
-      break;
+  var loweredCase = false;
+  for (;;) {
+    switch (encoding) {
+      case 'hex':
+        return this.hexWrite(string, offset, length);
 
-    case 'ascii':
-      ret = this.asciiWrite(string, offset, length);
-      break;
+      case 'utf8':
+      case 'utf-8':
+        return this.utf8Write(string, offset, length);
 
-    case 'binary':
-      ret = this.binaryWrite(string, offset, length);
-      break;
+      case 'ascii':
+        return this.asciiWrite(string, offset, length);
 
-    case 'base64':
-      // Warning: maxLength not taken into account in base64Write
-      ret = this.base64Write(string, offset, length);
-      break;
+      case 'binary':
+        return this.binaryWrite(string, offset, length);
 
-    case 'ucs2':
-    case 'ucs-2':
-    case 'utf16le':
-    case 'utf-16le':
-      ret = this.ucs2Write(string, offset, length);
-      break;
+      case 'base64':
+        // Warning: maxLength not taken into account in base64Write
+        return this.base64Write(string, offset, length);
 
-    default:
-      throw new TypeError('Unknown encoding: ' + encoding);
-  }
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return this.ucs2Write(string, offset, length);
 
-  return ret;
+      default:
+        if (loweredCase)
+          throw new TypeError('Unknown encoding: ' + encoding);
+        encoding = ('' + encoding).toLowerCase();
+        loweredCase = true;
+    }
+  }
 };