forked from matplotlib/matplotlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TestAgg.py
106 lines (85 loc) · 3.68 KB
/
TestAgg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#=======================================================================
"""The Agg backend unit-test class implementation."""
#=======================================================================
from mplTest import *
#=======================================================================
# Add import modules below.
# import matplotlib
# matplotlib.use( "Agg", warn = False )
import sys, time, os
from matplotlib.ft2font import FT2Font
from numpy.random import rand
from matplotlib.backend_bases import GraphicsContextBase
from matplotlib.backends._backend_agg import RendererAgg
#
#=======================================================================
#=======================================================================
def report_memory(i):
pid = os.getpid()
a2 = os.popen('ps -p %d -o rss,sz' % pid).readlines()
print i, ' ', a2[1],
return int(a2[1].split()[0])
#=======================================================================
class TestAgg( MplTestCase ):
"""Agg backend unit test class."""
# Uncomment any appropriate tags
tags = [
# 'gui', # requires the creation of a gui window
'agg', # uses agg in the backend
'agg-only', # uses only agg in the backend
# 'wx', # uses wx in the backend
# 'qt', # uses qt in the backend
# 'ps', # uses the postscript backend
# 'units', # uses units in the test
# 'PIL', # uses PIL for image comparison
]
#--------------------------------------------------------------------
def setUp( self ):
"""Setup any data needed for the unit test."""
pass
#--------------------------------------------------------------------
def tearDown( self ):
"""Clean-up any generated files here."""
pass
#--------------------------------------------------------------------
def DISABLED_memleak( self ):
"""Test agg backend for memory leaks."""
fontname = '/usr/local/share/matplotlib/Vera.ttf'
fname = self.outFile( "agg_memleak_%05d.png" )
N = 200
for i in range( N ):
gc = GraphicsContextBase()
gc.set_clip_rectangle( [20, 20, 20, 20] )
o = RendererAgg( 400, 400, 72 )
for j in range( 50 ):
xs = [ 400*int(rand()) for k in range(8) ]
ys = [ 400*int(rand()) for k in range(8) ]
rgb = (1, 0, 0)
pnts = zip( xs, ys )
o.draw_polygon( gc, rgb, pnts )
o.draw_polygon( gc, None, pnts )
for j in range( 50 ):
x = [ 400*int(rand()) for k in range(4) ]
y = [ 400*int(rand()) for k in range(4) ]
o.draw_lines( gc, x, y )
for j in range( 50 ):
args = [ 400*int(rand()) for k in range(4) ]
rgb = (1, 0, 0)
o.draw_rectangle( gc, rgb, *args )
if 1: # add text
font = FT2Font( fontname )
font.clear()
font.set_text( 'hi mom', 60 )
font.set_size( 12, 72 )
o.draw_text_image( font.get_image(), 30, 40, gc )
o.write_png( fname % i )
val = report_memory( i )
if i==1: start = val
end = val
avgMem = (end - start) / float(N)
print 'Average memory consumed per loop: %1.4f\n' % (avgMem)
#TODO: Verify the expected mem usage and approximate tolerance that should be used
self.checkClose( 0.32, avgMem, absTol = 0.1 )
# w/o text and w/o write_png: Average memory consumed per loop: 0.02
# w/o text and w/ write_png : Average memory consumed per loop: 0.3400
# w/ text and w/ write_png : Average memory consumed per loop: 0.32