#!/usr/bin/env python# -*- coding: utf-8 -*-# FIXME: TypeError: 'EventBinding' object is not callablefrom __future__ import print_functionimport clrimport gcimport sysimport Systemfrom .utils import (CallableHandler, ClassMethodHandler, GenericHandler,HelloClass, StaticMethodHandler, VarCallableHandler,VariableArgsHandler, hello_func)class LeakTest(object):"""A leak-check test for the objects implemented in the managedruntime. For each kind of object tested, memory should reacha particular level after warming up and stay essentially thesame, net of minor fluctuation induced by GC."""def __init__(self):self.count = 50000self.quiet = 0self._ws = 0def notify(self, msg):if not self.quiet:print(msg)def start_test(self):System.GC.Collect(System.GC.MaxGeneration)gc.collect()self._ws = System.Environment.WorkingSetdef end_test(self):start = self._wsSystem.GC.Collect(System.GC.MaxGeneration)gc.collect()end = System.Environment.WorkingSetdiff = end - startif diff > 0:diff = '+{0}'.format(diff)else:diff = '{0}'.format(diff)print(" start: {0} end: {1} diff: {2}".format(start, end, diff))print("")def run(self):self.testModules()self.testClasses()self.testEnumerations()self.testEvents()self.testDelegates()def report(self):gc.collect()dicttype = type({})for item in gc.get_objects():if type(item) != dicttype:print(item, sys.getrefcount(item))def test_modules(self):self.notify("Running module leak check...")for i in range(self.count):if i == 10:self.start_test()__import__('clr')__import__('System')__import__('System.IO')__import__('System.Net')__import__('System.Xml')self.end_test()def test_classes(self):from System.Collections import Hashtablefrom Python.Test import StringDelegateself.notify("Running class leak check...")for i in range(self.count):if i == 10:self.start_test()# Reference typex = Hashtable()del x# Value typex = System.Int32(99)del x# Delegate typex = StringDelegate(hello_func)del xself.end_test()def test_enumerations(self):import Python.Test as Testself.notify("Running enum leak check...")for i in range(self.count):if i == 10:self.start_test()x = Test.ByteEnum.Zerodel xx = Test.SByteEnum.Zerodel xx = Test.ShortEnum.Zerodel xx = Test.UShortEnum.Zerodel xx = Test.IntEnum.Zerodel xx = Test.UIntEnum.Zerodel xx = Test.LongEnum.Zerodel xx = Test.ULongEnum.Zerodel xself.end_test()def test_events(self):from Python.Test import EventTest, EventArgsTestself.notify("Running event leak check...")for i in range(self.count):if i == 10:self.start_test()testob = EventTest()# Instance method event handlerhandler = GenericHandler()testob.PublicEvent += handler.handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handler.handlerdel handler# Vararg method event handlerhandler = VariableArgsHandler()testob.PublicEvent += handler.handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handler.handlerdel handler# Callable object event handlerhandler = CallableHandler()testob.PublicEvent += handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handlerdel handler# Callable vararg event handlerhandler = VarCallableHandler()testob.PublicEvent += handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handlerdel handler# Static method event handlerhandler = StaticMethodHandler()StaticMethodHandler.value = Nonetestob.PublicEvent += handler.handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handler.handlerdel handler# Class method event handlerhandler = ClassMethodHandler()ClassMethodHandler.value = Nonetestob.PublicEvent += handler.handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handler.handlerdel handler# Managed instance event handlertestob.PublicEvent += testob.GenericHandlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= testob.GenericHandler# Static managed event handlertestob.PublicEvent += EventTest.StaticHandlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= EventTest.StaticHandler# Function event handlerdict_ = {'value': None}def handler(sender, args, dict_=dict_):dict_['value'] = args.valuetestob.PublicEvent += handlertestob.PublicEvent(testob, EventArgsTest(10))testob.PublicEvent -= handlerdel handlerself.end_test()def test_delegates(self):from Python.Test import DelegateTest, StringDelegateself.notify("Running delegate leak check...")for i in range(self.count):if i == 10:self.start_test()# Delegate from functiontestob = DelegateTest()d = StringDelegate(hello_func)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d# Delegate from instance methodinst = HelloClass()testob = DelegateTest()d = StringDelegate(inst.hello)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel instdel d# Delegate from static methodtestob = DelegateTest()d = StringDelegate(HelloClass.s_hello)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d# Delegate from class methodtestob = DelegateTest()d = StringDelegate(HelloClass.c_hello)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d# Delegate from callable objectinst = HelloClass()testob = DelegateTest()d = StringDelegate(inst)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel instdel d# Delegate from managed instance methodtestob = DelegateTest()d = StringDelegate(testob.SayHello)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d# Delegate from managed static methodtestob = DelegateTest()d = StringDelegate(DelegateTest.StaticSayHello)testob.CallStringDelegate(d)testob.stringDelegate = dtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d# Nested delegatestestob = DelegateTest()d1 = StringDelegate(hello_func)d2 = StringDelegate(d1)testob.CallStringDelegate(d2)testob.stringDelegate = d2testob.stringDelegate()testob.stringDelegate = Nonedel testobdel d1del d2# Multicast delegatestestob = DelegateTest()d1 = StringDelegate(hello_func)d2 = StringDelegate(hello_func)md = System.Delegate.Combine(d1, d2)testob.CallStringDelegate(md)testob.stringDelegate = mdtestob.stringDelegate()testob.stringDelegate = Nonedel testobdel d1del d2del mdself.end_test()if __name__ == '__main__':test = LeakTest()test.run()test.report()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。