Skip to content

Commit 79fe810

Browse files
committed
Substantial performance improvements.
1 parent 9692db7 commit 79fe810

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

sc2reader/decoders.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def byte_align(self):
176176

177177
def read_uint8(self):
178178
""" Returns the next 8 bits as an unsigned integer """
179-
data = self._buffer.read_uint8()
179+
data = ord(self._buffer.read(1))
180180

181181
if self._bit_shift != 0:
182182
lo_mask, hi_mask = self._bit_masks[self._bit_shift]
@@ -231,7 +231,7 @@ def read_uint64(self):
231231

232232
def read_vint(self):
233233
""" Reads a signed integer of variable length """
234-
byte = self.read_uint8()
234+
byte = ord(self._buffer.read(1))
235235
negative = byte & 0x01
236236
result = (byte & 0x7F) >> 1
237237
bits = 6
@@ -335,8 +335,8 @@ def read_struct(self, datatype=None):
335335
""" Reads a nested data structure. If the type is not specified the
336336
first byte is used as the type identifier.
337337
"""
338-
self.byte_align() # I think this is true
339-
datatype = self.read_uint8() if datatype is None else datatype
338+
self.byte_align()
339+
datatype = ord(self._buffer.read(1)) if datatype is None else datatype
340340

341341
if datatype == 0x00: # array
342342
data = [self.read_struct() for i in range(self.read_vint())]
@@ -347,31 +347,28 @@ def read_struct(self, datatype=None):
347347

348348
elif datatype == 0x02: # blob
349349
length = self.read_vint()
350-
data = self.read_bytes(length)
350+
data = self._buffer.read_bytes(length)
351351

352352
elif datatype == 0x03: # choice
353353
flag = self.read_vint()
354354
data = self.read_struct()
355355

356356
elif datatype == 0x04: # optional
357-
exists = self.read_uint8() != 0
357+
exists = self._buffer.read_uint8() != 0
358358
data = self.read_struct() if exists else None
359359

360360
elif datatype == 0x05: # Struct
361-
data = OrderedDict()
362361
entries = self.read_vint()
363-
for i in range(entries):
364-
key = self.read_vint() # Must be read first
365-
data[key] = self.read_struct()
362+
data = dict([(self.read_vint(), self.read_struct()) for i in range(entries)])
366363

367364
elif datatype == 0x06: # u8
368-
data = self.read_uint8()
365+
data = ord(self._buffer.read(1))
369366

370367
elif datatype == 0x07: # u32
371-
data = self.read_bytes(4) # self.read_uint32()
368+
data = self._buffer.read_bytes(4) # self.read_uint32()
372369

373370
elif datatype == 0x08: # u64
374-
data = self.read_unit64()
371+
data = self._buffer.read_unit64()
375372

376373
elif datatype == 0x09: # vint
377374
data = self.read_vint()

sc2reader/readers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,8 +2077,10 @@ def __call__(self, data, replay):
20772077
frames = 0
20782078
events = list()
20792079
while not decoder.done():
2080-
frames += decoder.read_struct()
2081-
etype = decoder.read_struct()
2080+
decoder._buffer.read(3) # 03 00 09
2081+
frames += decoder.read_vint()
2082+
decoder._buffer.read(1) # 09
2083+
etype = decoder.read_vint()
20822084
event_data = decoder.read_struct()
20832085
event = self.EVENT_DISPATCH[etype](frames, event_data, replay.build)
20842086
events.append(event)

0 commit comments

Comments
 (0)