-
Notifications
You must be signed in to change notification settings - Fork 2
/
Profiler.m
94 lines (67 loc) · 2.29 KB
/
Profiler.m
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
(* ::Package:: *)
(*
This file is part of BProbeM.
"BProbeM, quantum and fuzzy geometry scanner" Copyright 2018 Timon Gutleb (timon.gutleb@gmail.com),
see https://github.com/TSGut/BProbeM/
Original version "BProbe" Copyright 2015 Lukas Schneiderbauer (lukas.schneiderbauer@gmail.com),
see https://github.com/lschneiderbauer/BProbe
BProbeM and BProbe are free software: you can redistribute them and/or modify
them under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
BProbeM and BProbe are distributed in the hope that they will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with BProbeM. If not, see <http://www.gnu.org/licenses/>.
*)
BeginPackage["BProbe`Profiler`"];
AddRecord::usage="";
ShowProfileChart::usage="";
ResetProfile::usage="";
Begin["`Private`"];
(* initialize *)
profiles = <||>;
SetAttributes[AddRecord, HoldRest];
AddRecord[id_, expr_, n_:1] := Block[{timing},
If[n!=0,
(* create id if doesnt exist *)
If[!VectorQ[profiles[id]],
AppendTo[profiles, id -> {}];
];
timing = AbsoluteTiming[expr];
profiles[id] = profiles[id] ~Join~ Table[timing[[1]]/n,{n}];
Return[timing[[2]]];
,
Return[expr];
];
];
ShowProfileChart[] := Block[{bc},
bc = BarChart[
(Tooltip[
GetTotalTime[#],
GetText[#]
])& /@ Keys[profiles],
ChartLegends -> Keys[profiles],
ChartStyle -> "DarkRainbow",
PlotTheme -> "Business"
];
Return[bc];
];
GetText[id_] := Block[{text},
text = "_" <> TextString[id] <> "_\n"
<> "Mean:\t(" <> TextString[GetMean[id]] <> " \[PlusMinus] "
<> TextString[GetStandardDeviation[id]] <> ") s\n"
<> "\[NumberSign] calls:\t" <> TextString[GetNumberOfCalls[id]];
Return[text];
];
GetMean[id_] := Mean[profiles[id]];
GetStandardDeviation[id_] := StandardDeviation[profiles[id]];
GetNumberOfCalls[id_] := Length[profiles[id]];
GetTotalTime[id_] := Total[profiles[id]];
ResetProfile[] := Block[{},
profiles = <||>;
];
End[];
EndPackage[];