Commits

Anonymous committed e08426b

Improve performance of Python serialization. Patch from Will Pierce.

  • Participants
  • Parent commits b2cee15

Comments (0)

Files changed (2)

File CONTRIBUTORS.txt

     * Added generation of field number constants.
   Wink Saville <wink@google.com>
     * Fixed initialization ordering problem in logging code.
+  Will Pierce <willp@nuclei.com>
+    * Small patch improving performance of in Python serialization.

File python/google/protobuf/internal/wire_format.py

 # Private helper function for the *ByteSize() functions above.
 
 def _VarUInt64ByteSizeNoTag(uint64):
-  """Returns the bytes required to serialize a single varint.
+  """Returns the number of bytes required to serialize a single varint
+  using boundary value comparisons. (unrolled loop optimization -WPierce)
   uint64 must be unsigned.
   """
+  if uint64 <= 0x7f: return 1
+  if uint64 <= 0x3fff: return 2
+  if uint64 <= 0x1fffff: return 3
+  if uint64 <= 0xfffffff: return 4
+  if uint64 <= 0x7ffffffff: return 5
+  if uint64 <= 0x3ffffffffff: return 6
+  if uint64 <= 0x1ffffffffffff: return 7
+  if uint64 <= 0xffffffffffffff: return 8
+  if uint64 <= 0x7fffffffffffffff: return 9
   if uint64 > UINT64_MAX:
     raise message.EncodeError('Value out of range: %d' % uint64)
-  bytes = 1
-  while uint64 > 0x7f:
-    bytes += 1
-    uint64 >>= 7
-  return bytes
+  return 10