lean4-htt/src/runtime/allocprof.cpp
Leonardo de Moura 39dd079e37 feat(runtime): low tech allocation profiler
```
@[extern 4 "lean_io_allocprof"]
constant allocprof {α : Type} (msg : @& string) (fn : io α) : io α
```
2019-03-14 15:15:29 -07:00

47 lines
1.9 KiB
C++

/*
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "runtime/allocprof.h"
namespace lean {
allocprof::allocprof(std::ostream & out, char const * msg):
m_out(out), m_msg(msg) {
#ifdef LEAN_RUNTIME_STATS
m_num_ctor = g_num_ctor;
m_num_closure = g_num_closure;
m_num_string = g_num_string;
m_num_array = g_num_array;
m_num_thunk = g_num_thunk;
m_num_task = g_num_task;
m_num_ext = g_num_ext;
#endif
}
allocprof::~allocprof() {
m_out << m_msg << "\n";
#ifdef LEAN_RUNTIME_STATS
uint64 num_ctor = g_num_ctor - m_num_ctor;
uint64 num_closure = g_num_closure - m_num_closure;
uint64 num_string = g_num_string - m_num_string;
uint64 num_array = g_num_array - m_num_array;
uint64 num_thunk = g_num_thunk - m_num_thunk;
uint64 num_task = g_num_task - m_num_task;
uint64 num_ext = g_num_ext - m_num_ext;
if (num_ctor > 0) m_out << "num. constructor: " << num_ctor << "\n";
if (num_closure > 0) m_out << "num. closure: " << num_closure << "\n";
if (num_string > 0) m_out << "num. string: " << num_string << "\n";
if (num_array > 0) m_out << "num. array: " << num_array << "\n";
if (num_thunk > 0) m_out << "num. thunk: " << num_thunk << "\n";
if (num_task > 0) m_out << "num. task: " << num_task << "\n";
if (num_ext > 0) m_out << "num. external: " << num_ext << "\n";
if (num_ctor == 0 && num_closure == 0 && num_string == 0 && num_array == 0 &&
num_thunk == 0 && num_task == 0 && num_ext == 0) {
m_out << "***no runtime object allocation has occurred**\n";
}
m_out << "-------------\n";
#else
m_out << "Allocation profiling data is not available, compile lean using `-D RUNTIME_STATS=ON`\n";
#endif
}
}