YAP 7.1.0
dbusage.yap
Go to the documentation of this file.
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,
16 db_dynamic/0,
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*/
34db_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
94db_usage:-
95 write(mem_dump_error),write.
96
97
98/** @pred db_static
99
100
101List memory usage for every static predicate.
102
103
104*/
105write :-
106 db_static(-1).
107
108/** @pred db_static(+ _Threshold_)
109
110List memory usage for every static predicate. Predicate must use more
111than _Threshold_ bytes.
112
113
114*/
115db_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
124statics(M,P) :-
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
135List memory usage for every dynamic predicate.
136
137
138*/
139predicate_property :-
140 db_dynamic(-1).
141
142/** @pred db_dynamic(+ _Threshold_)
143
144List memory usage for every dynamic predicate. Predicate must use more
145than _Threshold_ bytes.
146
147
148
149
150 */
151db_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
162dynamics(M,P) :-
164 M \= current_module,
165 current_predicate(_PN,M:P),
166 predicate_property(M:P,dynamic),
167 \+predicate_property(M:P,imported_from(_)).
168dynamics(idb,P) :-
169 current_key(_,P).
170
171display_preds([]).
172display_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.
180display_preds([_|All]) :-
181 display_preds(All).
182
183
184display_dpreds([]).
185display_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.
207display_dpreds([_|All]) :-
208 display_dpreds(All).
209
210
211sumall(LEDAll, TEDCls, TEDCSz, TEDISz) :-
212 sumall(LEDAll, 0, TEDCls, 0, TEDCSz, 0, TEDISz).
213
214sumall([], TEDCls, TEDCls, TEDCSz, TEDCSz, TEDISz, TEDISz).
215sumall([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(? A,? K)
current_predicate( A, P)
predicate_property( P, Prop)
statistics(? Param,- Info)
Definition: statistics.yap:83
current_module( ? Mod:atom)
findall( T,+ G,- L)
Definition: setof.yap:70
setof( X,+ P,- B)
functor( T, F, N)
integer( T)
db_dynamic(+ Threshold)
db_static(+ Threshold)