mirror of
https://github.com/yse/easy_profiler.git
synced 2024-12-28 01:04:41 +08:00
Merge branch 'event_tracing' of https://github.com/yse/easy_profiler into event_tracing
This commit is contained in:
commit
68bbd0eef3
@ -2,8 +2,8 @@ project(profiling_tool)
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set(
|
||||
ROOT
|
||||
${CMAKE_CURRENT_LIST_DIR}
|
||||
ROOT
|
||||
${CMAKE_CURRENT_LIST_DIR}
|
||||
)
|
||||
|
||||
set(OUTPUT_DIR
|
||||
@ -23,16 +23,16 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY
|
||||
)
|
||||
|
||||
include_directories(
|
||||
include
|
||||
include
|
||||
)
|
||||
|
||||
if(UNIX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -Wno-reorder -pedantic -O3" )
|
||||
else()
|
||||
add_definitions(
|
||||
-D_CRT_SECURE_NO_WARNINGS
|
||||
)
|
||||
add_definitions(
|
||||
-D_CRT_SECURE_NO_WARNINGS
|
||||
)
|
||||
endif(UNIX)
|
||||
|
||||
add_subdirectory(src)
|
||||
|
@ -26,13 +26,21 @@ along with this program.If not, see <http://www.gnu.org/licenses/>.
|
||||
# define EASY_THREAD_LOCAL __declspec(thread)
|
||||
# endif
|
||||
#elif defined(__GNUC__)
|
||||
#ifndef __clang__
|
||||
# if (__GNUC__ == 4 && __GNUC_MINOR__ < 8) || (__GNUC__ < 4)
|
||||
// There is no support for C++11 thread_local keyword prior to gcc 4.8. Use __thread instead.
|
||||
# define EASY_THREAD_LOCAL __thread
|
||||
#endif
|
||||
# endif
|
||||
#if defined ( __clang__ )
|
||||
# if (__clang_major__ == 3 && __clang_minor__ < 3) || (__clang_major__ < 3)
|
||||
# define EASY_THREAD_LOCAL __thread
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// TODO: Check thread_local support for Clang!
|
||||
#endif
|
||||
|
||||
// TODO: Check thread local support for clanv earlier than 3.3
|
||||
|
||||
#ifndef EASY_THREAD_LOCAL
|
||||
# define EASY_THREAD_LOCAL thread_local
|
||||
@ -76,19 +84,19 @@ namespace profiler {
|
||||
/** Macro of beginning of block with custom name and color.
|
||||
|
||||
\code
|
||||
#include "profiler/profiler.h"
|
||||
void foo()
|
||||
{
|
||||
// some code ...
|
||||
if(something){
|
||||
EASY_BLOCK("Calling bar()"); // Block with default color
|
||||
bar();
|
||||
}
|
||||
#include "profiler/profiler.h"
|
||||
void foo()
|
||||
{
|
||||
// some code ...
|
||||
if(something){
|
||||
EASY_BLOCK("Calling bar()"); // Block with default color
|
||||
bar();
|
||||
}
|
||||
else{
|
||||
EASY_BLOCK("Calling baz()", profiler::colors::Red); // Red block
|
||||
baz();
|
||||
}
|
||||
}
|
||||
}
|
||||
\endcode
|
||||
|
||||
Block will be automatically completed by destructor.
|
||||
@ -104,11 +112,11 @@ Block will be automatically completed by destructor.
|
||||
/** Macro of beginning of block with function name and custom color.
|
||||
|
||||
\code
|
||||
#include "profiler/profiler.h"
|
||||
void foo(){
|
||||
EASY_FUNCTION(); // Block with name="foo" and default color
|
||||
//some code...
|
||||
}
|
||||
#include "profiler/profiler.h"
|
||||
void foo(){
|
||||
EASY_FUNCTION(); // Block with name="foo" and default color
|
||||
//some code...
|
||||
}
|
||||
|
||||
void bar(){
|
||||
EASY_FUNCTION(profiler::colors::Green); // Green block with name="bar"
|
||||
@ -134,12 +142,12 @@ int foo()
|
||||
{
|
||||
// some code ...
|
||||
|
||||
int sum = 0;
|
||||
EASY_BLOCK("Calculating sum");
|
||||
for (int i = 0; i < 10; ++i){
|
||||
sum += i;
|
||||
}
|
||||
EASY_END_BLOCK;
|
||||
int sum = 0;
|
||||
EASY_BLOCK("Calculating sum");
|
||||
for (int i = 0; i < 10; ++i){
|
||||
sum += i;
|
||||
}
|
||||
EASY_END_BLOCK;
|
||||
|
||||
// some antoher code here ...
|
||||
|
||||
@ -211,10 +219,10 @@ This is only for user comfort. There is no difference for EasyProfiler GUI betwe
|
||||
#include "profiler/profiler_colors.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef _BUILD_PROFILER
|
||||
#define PROFILER_API __declspec(dllexport)
|
||||
#ifdef _BUILD_PROFILER
|
||||
#define PROFILER_API __declspec(dllexport)
|
||||
#else
|
||||
#define PROFILER_API __declspec(dllimport)
|
||||
#define PROFILER_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define PROFILER_API
|
||||
@ -225,7 +233,7 @@ class ThreadStorage;
|
||||
|
||||
namespace profiler {
|
||||
|
||||
class Block;
|
||||
class Block;
|
||||
|
||||
typedef uint64_t timestamp_t;
|
||||
typedef uint32_t thread_id_t;
|
||||
@ -241,8 +249,8 @@ namespace profiler {
|
||||
BLOCK_TYPES_NUMBER
|
||||
};
|
||||
typedef BlockType block_type_t;
|
||||
|
||||
extern "C" {
|
||||
|
||||
extern "C" {
|
||||
PROFILER_API block_id_t registerDescription(const char* _name, const char* _filename, int _line, block_type_t _block_type, color_t _color = DefaultBlockColor);
|
||||
PROFILER_API void beginBlock(Block& _block);
|
||||
PROFILER_API void endBlock();
|
||||
@ -251,8 +259,8 @@ namespace profiler {
|
||||
PROFILER_API const char* setThreadName(const char* name, const char* filename, const char* _funcname, int line);
|
||||
PROFILER_API void setContextSwitchLogFilename(const char* name);
|
||||
PROFILER_API const char* getContextSwitchLogFilename();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#pragma pack(push,1)
|
||||
class PROFILER_API BaseBlockDescriptor
|
||||
{
|
||||
|
@ -84,7 +84,7 @@ const QRgb TIMELINE_BACKGROUND = 0x20303030;
|
||||
const QRgb SELECTED_ITEM_COLOR = 0x000050a0;
|
||||
const QColor CHRONOMETER_COLOR2 = QColor::fromRgba(0x40408040);
|
||||
|
||||
const unsigned int TEST_PROGRESSION_BASE = 4;
|
||||
//const unsigned int TEST_PROGRESSION_BASE = 4;
|
||||
|
||||
const int FLICKER_INTERVAL = 16; // 60Hz
|
||||
|
||||
|
@ -211,7 +211,7 @@ public:
|
||||
|
||||
void setHover(bool _hover);
|
||||
|
||||
bool contains(const QPointF& _pos) const;
|
||||
bool contains(const QPointF& _pos) const override;
|
||||
|
||||
inline bool hoverIndicator() const
|
||||
{
|
||||
|
@ -41,7 +41,7 @@
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
const qreal SCALING_COEFFICIENT = 1.25;
|
||||
const qreal SCALING_COEFFICIENT_INV = 1.0 / SCALING_COEFFICIENT;
|
||||
//const qreal SCALING_COEFFICIENT_INV = 1.0 / SCALING_COEFFICIENT;
|
||||
const int DEFAULT_TOP = -40;
|
||||
const int DEFAULT_HEIGHT = 80;
|
||||
const int INDICATOR_SIZE = 8;
|
||||
@ -490,7 +490,6 @@ void EasyGraphicsScrollbar::mouseMoveEvent(QMouseEvent* _event)
|
||||
|
||||
void EasyGraphicsScrollbar::wheelEvent(QWheelEvent* _event)
|
||||
{
|
||||
qreal deltaSign = _event->delta() < 0 ? -1 : 1;
|
||||
auto w = m_slider->halfwidth() * (_event->delta() < 0 ? ::profiler_gui::SCALING_COEFFICIENT : ::profiler_gui::SCALING_COEFFICIENT_INV);
|
||||
setValue(mapToScene(_event->pos()).x() - m_minimumValue - w);
|
||||
emit wheeled(w * m_windowScale, _event->delta());
|
||||
|
@ -38,17 +38,17 @@ decltype(LARGE_INTEGER::QuadPart) CPU_FREQUENCY = ([](){ LARGE_INTEGER freq; Que
|
||||
inline timestamp_t getCurrentTime()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
//see https://msdn.microsoft.com/library/windows/desktop/dn553408(v=vs.85).aspx
|
||||
LARGE_INTEGER elapsedMicroseconds;
|
||||
if (!QueryPerformanceCounter(&elapsedMicroseconds))
|
||||
return 0;
|
||||
//see https://msdn.microsoft.com/library/windows/desktop/dn553408(v=vs.85).aspx
|
||||
LARGE_INTEGER elapsedMicroseconds;
|
||||
if (!QueryPerformanceCounter(&elapsedMicroseconds))
|
||||
return 0;
|
||||
//elapsedMicroseconds.QuadPart *= 1000000000LL;
|
||||
//elapsedMicroseconds.QuadPart /= CPU_FREQUENCY;
|
||||
return (timestamp_t)elapsedMicroseconds.QuadPart;
|
||||
return (timestamp_t)elapsedMicroseconds.QuadPart;
|
||||
#else
|
||||
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> time_point;
|
||||
time_point = std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now());
|
||||
return time_point.time_since_epoch().count();
|
||||
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> time_point;
|
||||
time_point = std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now());
|
||||
return time_point.time_since_epoch().count();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -68,19 +68,19 @@ extern "C" {
|
||||
}
|
||||
|
||||
PROFILER_API void beginBlock(Block& _block)
|
||||
{
|
||||
{
|
||||
MANAGER.beginBlock(_block);
|
||||
}
|
||||
}
|
||||
|
||||
PROFILER_API uint32_t dumpBlocksToFile(const char* filename)
|
||||
{
|
||||
PROFILER_API uint32_t dumpBlocksToFile(const char* filename)
|
||||
{
|
||||
return MANAGER.dumpBlocksToFile(filename);
|
||||
}
|
||||
}
|
||||
|
||||
PROFILER_API const char* setThreadName(const char* name, const char* filename, const char* _funcname, int line)
|
||||
{
|
||||
{
|
||||
return MANAGER.setThreadName(name, filename, _funcname, line);
|
||||
}
|
||||
}
|
||||
|
||||
PROFILER_API void setContextSwitchLogFilename(const char* name)
|
||||
{
|
||||
@ -175,7 +175,7 @@ ProfileManager::ProfileManager()
|
||||
|
||||
ProfileManager::~ProfileManager()
|
||||
{
|
||||
//dumpBlocksToFile("test.prof");
|
||||
//dumpBlocksToFile("test.prof");
|
||||
}
|
||||
|
||||
ProfileManager& ProfileManager::instance()
|
||||
@ -249,7 +249,7 @@ void ProfileManager::endContextSwitch(profiler::thread_id_t _thread_id, profiler
|
||||
|
||||
void ProfileManager::setEnabled(bool isEnable)
|
||||
{
|
||||
m_isEnabled = isEnable;
|
||||
m_isEnabled = isEnable;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
@ -97,55 +97,58 @@ public:
|
||||
|
||||
const uint16_t SIZEOF_CSWITCH = sizeof(profiler::BaseBlockData) + 1;
|
||||
|
||||
class ThreadStorage final
|
||||
typedef std::vector<profiler::SerializedBlock*> serialized_list_t;
|
||||
|
||||
template <class T, const uint16_t N>
|
||||
struct BlocksList final
|
||||
{
|
||||
typedef std::vector<profiler::SerializedBlock*> serialized_list_t;
|
||||
BlocksList() = default;
|
||||
|
||||
template <class T, const uint16_t N>
|
||||
struct BlocksList final
|
||||
{
|
||||
class Stack final {
|
||||
//std::stack<T> m_stack;
|
||||
std::vector<T> m_stack;
|
||||
class Stack final {
|
||||
//std::stack<T> m_stack;
|
||||
std::vector<T> m_stack;
|
||||
|
||||
public:
|
||||
public:
|
||||
|
||||
inline void clear() { m_stack.clear(); }
|
||||
inline bool empty() const { return m_stack.empty(); }
|
||||
inline void clear() { m_stack.clear(); }
|
||||
inline bool empty() const { return m_stack.empty(); }
|
||||
|
||||
inline void emplace(profiler::Block& _block) {
|
||||
//m_stack.emplace(_block);
|
||||
m_stack.emplace_back(_block);
|
||||
}
|
||||
inline void emplace(profiler::Block& _block) {
|
||||
//m_stack.emplace(_block);
|
||||
m_stack.emplace_back(_block);
|
||||
}
|
||||
|
||||
template <class ... TArgs> inline void emplace(TArgs ... _args) {
|
||||
//m_stack.emplace(_args);
|
||||
m_stack.emplace_back(_args...);
|
||||
}
|
||||
template <class ... TArgs> inline void emplace(TArgs ... _args) {
|
||||
//m_stack.emplace(_args);
|
||||
m_stack.emplace_back(_args...);
|
||||
}
|
||||
|
||||
inline T& top() {
|
||||
//return m_stack.top();
|
||||
return m_stack.back();
|
||||
}
|
||||
inline T& top() {
|
||||
//return m_stack.top();
|
||||
return m_stack.back();
|
||||
}
|
||||
|
||||
inline void pop() {
|
||||
//m_stack.pop();
|
||||
m_stack.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
chunk_allocator<char, N> alloc;
|
||||
Stack openedList;
|
||||
serialized_list_t closedList;
|
||||
uint64_t usedMemorySize = 0;
|
||||
|
||||
void clearClosed() {
|
||||
serialized_list_t().swap(closedList);
|
||||
alloc.clear();
|
||||
usedMemorySize = 0;
|
||||
inline void pop() {
|
||||
//m_stack.pop();
|
||||
m_stack.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
chunk_allocator<char, N> alloc;
|
||||
Stack openedList;
|
||||
serialized_list_t closedList;
|
||||
uint64_t usedMemorySize = 0;
|
||||
|
||||
void clearClosed() {
|
||||
serialized_list_t().swap(closedList);
|
||||
alloc.clear();
|
||||
usedMemorySize = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class ThreadStorage final
|
||||
{
|
||||
public:
|
||||
|
||||
BlocksList<std::reference_wrapper<profiler::Block>, SIZEOF_CSWITCH * (uint16_t)1024U> blocks;
|
||||
@ -156,6 +159,8 @@ public:
|
||||
void storeBlock(const profiler::Block& _block);
|
||||
void storeCSwitch(const profiler::Block& _block);
|
||||
void clearClosed();
|
||||
|
||||
ThreadStorage() = default;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@ -182,7 +187,7 @@ class ProfileManager final
|
||||
public:
|
||||
|
||||
static ProfileManager& instance();
|
||||
~ProfileManager();
|
||||
~ProfileManager();
|
||||
|
||||
template <class ... TArgs>
|
||||
uint32_t addBlockDescriptor(TArgs ... _args)
|
||||
@ -194,8 +199,8 @@ public:
|
||||
}
|
||||
|
||||
void beginBlock(profiler::Block& _block);
|
||||
void endBlock();
|
||||
void setEnabled(bool isEnable);
|
||||
void endBlock();
|
||||
void setEnabled(bool isEnable);
|
||||
uint32_t dumpBlocksToFile(const char* filename);
|
||||
const char* setThreadName(const char* name, const char* filename, const char* _funcname, int line);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user