```
@[extern 4 "lean_io_allocprof"]
constant allocprof {α : Type} (msg : @& string) (fn : io α) : io α
```
47 lines
1.9 KiB
C++
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
|
|
}
|
|
}
|