1 | /*
|
2 | * Souffle - A Datalog Compiler
|
3 | * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved
|
4 | * Licensed under the Universal Permissive License v 1.0 as shown at:
|
5 | * - https://opensource.org/licenses/UPL
|
6 | * - <souffle root>/licenses/SOUFFLE-UPL.txt
|
7 | */
|
8 |
|
9 | /************************************************************************
|
10 | *
|
11 | * @file Logger.h
|
12 | *
|
13 | * A logger is the utility utilized by RAM programs to create logs and
|
14 | * traces.
|
15 | *
|
16 | ***********************************************************************/
|
17 |
|
18 | #pragma once
|
19 |
|
20 | #include "souffle/profile/ProfileEvent.h"
|
21 | #include "souffle/utility/MiscUtil.h"
|
22 | #include <cstddef>
|
23 | #include <functional>
|
24 | #include <string>
|
25 | #include <utility>
|
26 |
|
27 | namespace souffle {
|
28 |
|
29 | /**
|
30 | * The class utilized to times for the souffle profiling tool. This class
|
31 | * is utilized by both -- the interpreted and compiled version -- to conduct
|
32 | * the corresponding measurements.
|
33 | *
|
34 | * To far, only execution times are logged. More events, e.g. the number of
|
35 | * processed tuples may be added in the future.
|
36 | */
|
37 | class Logger {
|
38 | public:
|
39 | Logger(std::string label, std::size_t iteration) : Logger(label, iteration, []() { return 0; }) {}
|
40 |
|
41 | Logger(std::string label, std::size_t iteration, std::function<std::size_t()> size)
|
42 | : label(std::move(label)), start(now()), iteration(iteration), size(size), preSize(size()) {
|
43 | #ifdef WIN32
|
44 | HANDLE hProcess = GetCurrentProcess();
|
45 | PROCESS_MEMORY_COUNTERS processMemoryCounters;
|
46 | GetProcessMemoryInfo(hProcess, &processMemoryCounters, sizeof(processMemoryCounters));
|
47 | startMaxRSS = processMemoryCounters.PeakWorkingSetSize / 1000;
|
48 | #else
|
49 | struct rusage ru {};
|
50 | getrusage(RUSAGE_SELF, &ru);
|
51 | startMaxRSS = ru.ru_maxrss;
|
52 | #endif // WIN32
|
53 | // Assume that if we are logging the progress of an event then we care about usage during that time.
|
54 | ProfileEventSingleton::instance().resetTimerInterval();
|
55 | }
|
56 |
|
57 | ~Logger() {
|
58 | #ifdef WIN32
|
59 | HANDLE hProcess = GetCurrentProcess();
|
60 | PROCESS_MEMORY_COUNTERS processMemoryCounters;
|
61 | GetProcessMemoryInfo(hProcess, &processMemoryCounters, sizeof(processMemoryCounters));
|
62 | std::size_t endMaxRSS = processMemoryCounters.PeakWorkingSetSize / 1000;
|
63 | #else
|
64 | struct rusage ru {};
|
65 | getrusage(RUSAGE_SELF, &ru);
|
66 | std::size_t endMaxRSS = ru.ru_maxrss;
|
67 | #endif // WIN32
|
68 | ProfileEventSingleton::instance().makeTimingEvent(
|
69 | label, start, now(), startMaxRSS, endMaxRSS, size() - preSize, iteration);
|
70 | }
|
71 |
|
72 | private:
|
73 | std::string label;
|
74 | time_point start;
|
75 | std::size_t startMaxRSS;
|
76 | std::size_t iteration;
|
77 | std::function<std::size_t()> size;
|
78 | std::size_t preSize;
|
79 | };
|
80 | } // end of namespace souffle
|