import sys, copy
from itertools import *
from StringIO import StringIO

import benchbase
from benchbase import with_attributes, with_text, onlylib, serialized

############################################################
# Benchmarks
############################################################

class BenchMark(benchbase.BenchMarkBase):
    def __init__(self, lib):
        from lxml import etree, objectify
        self.objectify = objectify
        parser = etree.XMLParser(remove_blank_text=True)
        lookup = objectify.ObjectifyElementClassLookup()
        parser.setElementClassLookup(lookup)
        super(BenchMark, self).__init__(etree, parser)

    def bench_attribute(self, root):
        "1 2 4"
        for i in repeat(None, 3000):
            root.zzzzz

    def bench_attribute_cached(self, root):
        "1 2 4"
        cache = root.zzzzz
        for i in repeat(None, 3000):
            root.zzzzz

    def bench_attributes_deep(self, root):
        "1 2 4"
        for i in repeat(None, 3000):
            root.zzzzz['{cdefg}z00000']

    def bench_attributes_deep_cached(self, root):
        "1 2 4"
        cache1 = root.zzzzz
        cache2 = cache1['{cdefg}z00000']
        for i in repeat(None, 3000):
            root.zzzzz['{cdefg}z00000']

    def bench_objectpath(self, root):
        "1 2 4"
        path = self.objectify.ObjectPath(".zzzzz")
        for i in repeat(None, 3000):
            path(root)

    def bench_objectpath_deep(self, root):
        "1 2 4"
        path = self.objectify.ObjectPath(".zzzzz.{cdefg}z00000")
        for i in repeat(None, 3000):
            path(root)

    def bench_objectpath_deep_cached(self, root):
        "1 2 4"
        cache1 = root.zzzzz
        cache2 = cache1['{cdefg}z00000']
        path = self.objectify.ObjectPath(".zzzzz.{cdefg}z00000")
        for i in repeat(None, 3000):
            path(root)

    @with_text(text=True, utext=True, no_text=True)
    def bench_annotate(self, root):
        self.objectify.annotate(root)

    def bench_descendantpaths(self, root):
        root.descendantpaths()

    @with_text(text=True)
    def bench_type_inference(self, root):
        "1 2 4"
        el = root.aaaaa
        for i in repeat(None, 1000):
            el.getchildren()

    @with_text(text=True)
    def bench_type_inference_annotated(self, root):
        "1 2 4"
        el = root.aaaaa
        self.objectify.annotate(el)
        for i in repeat(None, 1000):
            el.getchildren()


if __name__ == '__main__':
    benchbase.main(BenchMark)


syntax highlighted by Code2HTML, v. 0.9.1