YAP
7.1.0
dbusage.yap
Go to the documentation of this file.
1
2
/**
3
* @file dbusage.yap
4
* @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
5
* @date Tue Nov 17 15:04:52 2015
6
*
7
* @brief Useful statistics on memory usage
8
*
9
*
10
*/
11
12
:- module(
dbusage
, [
13
db_usage/0,
14
db_static/0,
15
db_static/1
,
16
db_dynamic/0,
17
db_dynamic/1
18
]).
19
20
/**
21
* @defgroup dbusage Memory Usage in Prolog Data-Base
22
* @ingroup YAPLibrary
23
@{
24
25
This library provides a set of utilities for studying memory usage in YAP.
26
The following routines are available once included with the
27
`use_module(library(dbusage))` command.
28
*/
29
30
/** @pred db_usage
31
32
Give general overview of data-base usage in the system.
33
*/
34
db_usage
:-
35
statistics
(heap,[
HeapUsed
,
HeapFree
]),
36
statistics
(local_stack,[
GInU
,
FreeS
]),
37
statistics
(global_stack,[
SInU
,
_
]),
38
statistics
(trail,[
TInU
,
FreeT
]),
39
HeapUsedK
is
HeapUsed
//
1024
,
40
HeapFreeK
is
HeapFree
//
1024
,
41
StackSpace
is
(
GInU
+
SInU
+
FreeS
+
TInU
+
FreeT
)
//
1024
,
42
format(user_error,
'Heap Space = ~D KB (+ ~D KB free)~n'
,[
HeapUsedK
,
HeapFreeK
]),
43
format(user_error,
'Stack Space = ~D KB~n'
,[
StackSpace
]),
44
findall
(p(
Cls
,
CSz
,
ISz
),
45
(current_module(
M
),
46
current_predicate(
_
,
M
:
P
),
47
predicate_statistics(
M
:
P
,
Cls
,
CSz
,
ISz
)),
LAll
),
48
sumall(
LAll
,
TCls
,
TCSz
,
TISz
),
49
statistics
(atoms,[
AtomN
,
AtomS
]),
50
AtomSK
is
AtomS
//
1024
,
51
format(user_error,
'~D Atoms taking ~D KB~n'
,[
AtomN
,
AtomSK
]),
52
TSz
is
TCSz
+
TISz
,
53
TSzK
is
TSz
//
1024
,
54
TCSzK
is
TCSz
//
1024
,
55
TISzK
is
TISz
//
1024
,
56
format(user_error,
'Total User Code~n ~D clauses taking ~D KB~n ~D KB in clauses + ~D KB in indices~n'
,
57
[
TCls
,
TSzK
,
TCSzK
,
TISzK
]),
58
statistics
(static_code,[
SCl
,
SI
,
SI1
,
SI2
,
SI3
]),
59
SClK
is
SCl
//
1024
,
60
SIK
is
SI
//
1024
,
61
SI1K
is
SI1
//
1024
,
62
SI2K
is
SI2
//
1024
,
63
SI3K
is
SI3
//
1024
,
64
ST
is
SCl
+
SI
,
65
STK
is
ST
//
1024
,
66
format(user_error,
'Total Static code=~D KB~n ~D KB in clauses + ~D KB in indices (~D+~D+~D)~n'
,
67
[
STK
,
SClK
,
SIK
,
SI1K
,
SI2K
,
SI3K
]),
68
statistics
(dynamic_code,[
DCl
,
DI
,
DI1
,
DI2
,
DI3
,
DI4
]),
69
DClK
is
DCl
//
1024
,
70
DIK
is
DI
//
1024
,
71
DI1K
is
DI1
//
1024
,
72
DI2K
is
DI2
//
1024
,
73
DI3K
is
DI3
//
1024
,
74
DI4K
is
DI4
//
1024
,
75
DT
is
DCl
+
DI
,
76
DTK
is
DT
//
1024
,
77
format(user_error,
'Total Dynamic code=~D KB~n ~D KB in clauses + ~D KB in indices (~D+~D+~D+~D)~n'
,
78
[
DTK
,
DClK
,
DIK
,
DI1K
,
DI2K
,
DI3K
,
DI4K
]),
79
total_erased(
DCls
,
DSZ
,
ICls
,
ISZ
),
80
(
DCls
=:=
0
->
81
true
82
;
83
DSZK
is
DSZ
//
1024
,
84
format(user_error,
' ~D erased clauses not reclaimed (~D KB)~n'
,[
DCls
,
DSZK
])
85
),
86
(
ICls
=:=
0
->
87
88
;
89
ISZK
is
ISZ
//
1024
,
90
format(user_error,
' ~D erased indices not reclaimed (~D KB)~n'
,[
ICls
,
ISZK
])
91
),
92
!.
93
94
db_usage
:-
95
write(mem_dump_error),
write.
96
97
98
/** @pred db_static
99
100
101
List memory usage for every static predicate.
102
103
104
*/
105
write
:-
106
db_static
(
-
1
).
107
108
/** @pred db_static(+ _Threshold_)
109
110
List memory usage for every static predicate. Predicate must use more
111
than _Threshold_ bytes.
112
113
114
*/
115
db_static
(
Min
)
:-
116
setof
(p(
Sz
,
M
:
P
,
Cls
,
CSz
,
ISz
),
117
(statics(
M
,
P
),
118
predicate_statistics(
M
:
P
,
Cls
,
CSz
,
ISz
),
119
Sz
is
(
CSz
+
ISz
),
120
Sz
>
Min
),
All
),
121
format(user_error,
' Static user code~n===========================~n'
,[]),
122
display_preds(
All
).
123
124
statics(
M
,
P
)
:-
125
current_module
(
M
),
126
M
\=
current_module,
127
current_predicate
(
_PN
,
M
:
P
),
128
\+
predicate_property
(
M
:
P
,
dynamic
),
129
\+
predicate_property
(
M
:
P
,imported_from(
_
)).
130
131
132
/** @pred db_dynamic
133
134
135
List memory usage for every dynamic predicate.
136
137
138
*/
139
predicate_property
:-
140
db_dynamic
(
-
1
).
141
142
/** @pred db_dynamic(+ _Threshold_)
143
144
List memory usage for every dynamic predicate. Predicate must use more
145
than _Threshold_ bytes.
146
147
148
149
150
*/
151
db_dynamic
(
Min
)
:-
152
setof
(p(
Sz
,
M
:
P
,
Cls
,
CSz
,
ISz
,
ECls
,
ECSz
,
EISz
),
153
(dynamics(
M
,
P
),
154
predicate_statistics(
M
:
P
,
Cls
,
CSz
,
ISz
),
155
predicate_erased_statistics(
M
:
P
,
ECls
,
ECSz
,
EISz
),
156
Sz
is
(
CSz
+
ISz
+
ECSz
+
EISz
),
157
Sz
>
Min
),
158
All
),
159
format(user_error,
' Dynamic user code~n===========================~n'
,[]),
160
display_dpreds(
All
).
161
162
dynamic
s(
M
,
P
)
:-
163
current_module
(
M
),
164
M
\=
current_module,
165
current_predicate
(
_PN
,
M
:
P
),
166
predicate_property
(
M
:
P
,
dynamic
),
167
\+
predicate_property
(
M
:
P
,imported_from(
_
)).
168
dynamic
s(idb,
P
)
:-
169
current_key
(
_
,
P
).
170
171
display_preds([]).
172
display_preds([p(
Sz
,
M
:
P
,
Cls
,
CSz
,
ISz
)
|
_
])
:-
173
functor
(
P
,
A
,
N
),
174
KSz
is
Sz
//
1024
,
175
KCSz
is
CSz
//
1024
,
176
KISz
is
ISz
//
1024
,
177
(
M
=
user
->
Name
=
A
/
N
;
Name
=
M
:
A
/
N
),
178
format(user_error,
'~w~t~36+:~t~D~7+ clauses using~|~t~D~8+ KB (~D + ~D)~n'
,[
Name
,
Cls
,
KSz
,
KCSz
,
KISz
]),
179
format.
180
display_preds([
_
|
All
])
:-
181
display_preds(
All
).
182
183
184
display_dpreds([]).
185
display_dpreds([p(
Sz
,
M
:
P
,
Cls
,
CSz
,
ISz
,
ECls
,
ECSz
,
EISz
)
|
_
])
:-
186
(
integer
(
P
)
->
A
=
P
,
N
=
0
;
functor
(
P
,
A
,
N
) ),
187
KSz
is
Sz
//
1024
,
188
KCSz
is
CSz
//
1024
,
189
KISz
is
ISz
//
1024
,
190
(
M
=
->
Name
=
A
/
N
;
Name
=
M
:
A
/
N
),
191
format(user_error,
'~w~t~36+:~t~D~7+ clauses using~|~t~D~8+ KB (~D + ~D)~n'
,[
Name
,
Cls
,
KSz
,
KCSz
,
KISz
]),
192
(
ECls
=:=
0
193
->
194
true
195
;
196
ECSzK
is
ECSz
//
1024
,
197
format(user_error,
' ~D erased clauses: ~D KB~n'
,[
ECls
,
ECSzK
])
198
),
199
(
EISz
=:=
0
200
->
201
202
;
203
EISzK
is
EISz
//
1024
,
204
format(user_error,
' ~D KB erased indices~n'
,[
EISzK
])
205
),
206
fail.
207
display_dpreds([
_
|
All
])
:-
208
display_dpreds(
All
).
209
210
211
sumall(
LEDAll
,
TEDCls
,
TEDCSz
,
TEDISz
)
:-
212
sumall(
LEDAll
,
0
,
TEDCls
,
0
,
TEDCSz
,
0
,
TEDISz
).
213
214
sumall([],
TEDCls
,
TEDCls
,
TEDCSz
,
TEDCSz
,
TEDISz
,
TEDISz
).
215
sumall([p(
Cls
,
CSz
,
ISz
)
|
LEDAll
],
TEDCls0
,
TEDCls
,
TEDCSz0
,
TEDCSz
,
TEDISz0
,
TEDISz
)
:-
216
TEDClsI
is
Cls
+
TEDCls0
,
217
TEDCSzI
is
CSz
+
TEDCSz0
,
218
TEDISzI
is
ISz
+
TEDISz0
,
219
sumall(
LEDAll
,
TEDClsI
,
TEDCls
,
TEDCSzI
,
TEDCSz
,
TEDISzI
,
TEDISz
).
220
221
/**
222
@}
223
*/
224
current_key/2
current_key(? A,? K)
current_predicate/2
current_predicate( A, P)
predicate_property/2
predicate_property( P, Prop)
statistics/2
statistics(? Param,- Info)
Definition:
statistics.yap:83
current_module/1
current_module( ? Mod:atom)
findall/3
findall( T,+ G,- L)
Definition:
setof.yap:70
setof/3
setof( X,+ P,- B)
functor/3
functor( T, F, N)
integer/1
integer( T)
db_dynamic/1
db_dynamic(+ Threshold)
db_static/1
db_static(+ Threshold)
library
dbusage.yap
Generated by
1.9.3