@jerch: ich hab mir jetzt dein
https://github.com/6809/MC6809/pull/1/files näher angesehen...
Was mir nicht gefällt sind die ganzen
& register.BASE
Dann hab ich mich gefragt, was ist eigentlich schneller:
oder:
Hab timeit angeworfen:
Code: Alles auswählen
from timeit import Timer
import sys
# TEST_DATA = [0xff] * 10000
# TEST_DATA += [0x100] * 10000
# test1: 1.441sec
# test2: 1.434sec
TEST_DATA = [0xff] * 20000
TEST_DATA += [0x100] * 2000
# test1: 1.139sec
# test2: 1.593sec
def test1():
for n in TEST_DATA:
if n>0xff:
x = n & 0xff
else:
x = n
def test2():
for n in TEST_DATA:
x = n & 0xff
if __name__ == "__main__":
def timeit(func, number):
name = func.__name__
sys.stdout.write("%20s: " % name)
sys.stdout.flush()
t = Timer("%s()" % name, setup="from __main__ import %s" % name)
print("%.3fsec" % t.timeit(number))
number = 1000
timeit(test1, number)
timeit(test2, number)
Also, wenn ein Überlauf nicht so häufig vorkommt, dann ist die
if-Variante schneller.
Ich gehe einfach mal davon aus, das es in der Praxis nicht so oft vor kommt.
Deswegen hab ich mal einen Testlauf mit dem Benchmark gemacht.
Dazu hab ich den 'master' branch genommen und
https://github.com/6809/MC6809/blob/5da ... py#L63-L91 noch abgeändert.
Also diese beiden Varianten gegeneinander Verglichen:
Code: Alles auswählen
class ValueStorage8Bit(ValueStorage):
def set(self, v):
if v > 0xff:
v = v & 0xff
self.value = v
return v # e.g.: r = operand.set(a + 1)
class ValueStorage16Bit(ValueStorage):
def set(self, v):
if v > 0xffff:
v = v & 0xffff
self.value = v
return v # e.g.: r = operand.set(a + 1)
Code: Alles auswählen
class ValueStorage8Bit(ValueStorage):
def set(self, v):
v = v & 0xff
self.value = v
return v # e.g.: r = operand.set(a + 1)
class ValueStorage16Bit(ValueStorage):
def set(self, v):
v = v & 0xffff
self.value = v
return v # e.g.: r = operand.set(a + 1)
Leider schwanken die Benchmark Werte so stark, das man keine genaue Aussage treffen kann