OILS / vendor / souffle / profile / Logger.h View on Github | oilshell.org

80 lines, 45 significant
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
27namespace 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 */
37class Logger {
38public:
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
72private:
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