浏览代码

Improve performance of Python serialization. Patch from Will Pierce.

kenton@google.com 16 年之前
父节点
当前提交
a8e8ccf29c
共有 2 个文件被更改,包括 14 次插入6 次删除
  1. 2 0
      CONTRIBUTORS.txt
  2. 12 6
      python/google/protobuf/internal/wire_format.py

+ 2 - 0
CONTRIBUTORS.txt

@@ -65,3 +65,5 @@ Patch contributors:
     * 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.

+ 12 - 6
python/google/protobuf/internal/wire_format.py

@@ -227,13 +227,19 @@ def TagByteSize(field_number):
 # 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