Skip to content

Commit d1b461e

Browse files
committed
Further optimizations and performance improvements. Now parses in 30% less time than initial merge result
1 parent 3b67eab commit d1b461e

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

sc2reader/objects.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,15 @@ def apply(self): pass
206206

207207
"""Abstract Event Type, should not be directly instanciated"""
208208
def __init__(self, timestamp, player_id, event_type, event_code):
209-
self.time, self.seconds = (timestamp, timestamp/16)
209+
self.time, self.seconds = (timestamp, timestamp >> 4)
210210
self.timestr = "%s:%s" % (self.seconds/60, str(self.seconds%60).rjust(2, "0"))
211211
self.type = event_type
212212
self.code = event_code
213213
self.is_local = (player_id != 16)
214214
self.player = player_id
215215
self.bytes = bytes
216216
self.abilitystr = ""
217-
217+
218218
# Added for convenience
219219
self.is_init = (event_type == 0x00)
220220
self.is_player_action = (event_type == 0x01)

sc2reader/readers.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,21 +172,24 @@ def read(self, filecontents, replay):
172172

173173
while not buffer.empty:
174174
#Save the start so we can trace for debug purposes
175-
start = buffer.cursor
175+
#start = buffer.cursor
176176

177177
frames += buffer.read_timestamp()
178178
pid = buffer.shift(5)
179179
type, code = buffer.shift(3), buffer.read_byte()
180180

181+
181182
parser = PARSERS[type](code)
182-
if parser:
183-
event = parser(buffer, frames, type, code, pid)
184-
buffer.align()
185-
event.bytes = buffer.read_range(start,buffer.cursor)
186-
replay.events.append(event)
187-
else:
183+
184+
if parser == None:
188185
msg = "Unknown event: %s - %s at %s"
189186
raise TypeError(msg % (hex(type), hex(code), hex(start)))
187+
188+
event = parser(buffer, frames, type, code, pid)
189+
buffer.align()
190+
#event.bytes = buffer.read_range(start,buffer.cursor)
191+
replay.events.append(event)
192+
190193

191194
def get_setup_parser(self, code):
192195
if code in (0x0B,0x0C): return self.parse_join_event

sc2reader/utils.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ def __init__(self, file):
6868
self.lo_masks_inv = [0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF]
6969
self.hi_masks = [0xFF ^ mask for mask in self.lo_masks]
7070
self.hi_masks_inv = [0xFF ^ mask for mask in self.lo_masks_inv]
71-
71+
72+
self.read_basic = self.io.read
7273
'''
7374
Additional Properties
7475
'''
@@ -88,9 +89,9 @@ def reset(self): self.io.seek(0); self.bit_shift = 0
8889
def align(self): self.bit_shift=0
8990
def seek(self, position, mode=SEEK_SET):
9091
self.io.seek(position, mode)
91-
if self.io.tell() and self.bit_shift:
92+
if self.io.tell()!=0 and self.bit_shift!=0:
9293
self.io.seek(-1, SEEK_CUR)
93-
self.last_byte = ord(self.io.read(1))
94+
self.last_byte = ord(self.read_basic(1))
9495

9596
def peek(self, length):
9697
start,last,ret = self.cursor,self.last_byte,self.read_hex(length)
@@ -104,23 +105,23 @@ def peek(self, length):
104105
def read_byte(self):
105106
""" Basic byte read """
106107
if self.bit_shift==0:
107-
return ord(self.io.read(1))
108+
return ord(self.read_basic(1))
108109
else:
109110
return self.read(1)[0]
110111

111112
def read_int(self, endian=LITTLE_ENDIAN):
112113
""" int32 read """
113-
chars = self.io.read(4) if self.bit_shift==0 else self.read_chars(4)
114+
chars = self.read_basic(4) if self.bit_shift==0 else self.read_chars(4)
114115
return struct.unpack(endian+'I', chars)[0]
115116

116117
def read_short(self, endian=LITTLE_ENDIAN):
117118
""" short16 read """
118-
chars = self.io.read(2) if self.bit_shift==0 else self.read_chars(2)
119+
chars = self.read_basic(2) if self.bit_shift==0 else self.read_chars(2)
119120
return struct.unpack(endian+'H', chars)[0]
120121

121122
def read_chars(self, length=0):
122123
if self.bit_shift==0:
123-
return self.io.read(length)
124+
return self.read_basic(length)
124125
else:
125126
return ''.join(chr(byte) for byte in self.read(length))
126127

@@ -240,7 +241,7 @@ def _make_mask(byte, bit_length, current=1):
240241
def read_range(self, start, end):
241242
current = self.cursor
242243
self.io.seek(start)
243-
ret = self.io.read(end-start)
244+
ret = self.read_basic(end-start)
244245
self.io.seek(current)
245246
return ret
246247

@@ -265,7 +266,7 @@ def shift(self, bits):
265266
#make sure there are enough bits left in the byte
266267
if new_shift <= 8:
267268
if not bit_shift:
268-
self.last_byte = ord(self.io.read(1))
269+
self.last_byte = ord(self.read_basic(1))
269270

270271
#using a bit_mask_array tested out to be 20% faster, go figure
271272
ret = (self.last_byte >> bit_shift) & self.lo_masks[bits]
@@ -294,7 +295,7 @@ def read(self, bytes=0, bits=0):
294295

295296
#check special case of byte-aligned reads, performance booster
296297
if self.bit_shift == 0:
297-
base = [ord(self.io.read(1)) for byte in range(bytes)]
298+
base = [ord(self.read_basic(1)) for byte in range(bytes)]
298299
if bits != 0:
299300
return base+[self.shift(bits)]
300301
return base
@@ -319,7 +320,7 @@ def read(self, bytes=0, bits=0):
319320

320321
#Set up for the looping with a list, the bytes, and an initial part
321322
raw_bytes = list()
322-
prev, next = self.last_byte, ord(self.io.read(1))
323+
prev, next = self.last_byte, ord(self.read_basic(1))
323324
first = prev & hi_mask
324325
bit_count -= 8-old_bit_shift
325326

@@ -351,7 +352,7 @@ def read(self, bytes=0, bits=0):
351352
bit_count -= 8
352353

353354
#Cycle down to the next byte
354-
prev,next = next,ord(self.io.read(1))
355+
prev,next = next,ord(self.read_basic(1))
355356

356357
self.last_byte = next
357358
self.bit_shift = new_bit_shift

0 commit comments

Comments
 (0)