目标快速检测一个函数耗时测试#define PROFILER #include profiler/profiler.h void test() { MLX_PROFILE_FUNCTION(); _sleep(1000); } int main(int argc, char* argv[]) { mlx::Profiler::get(); return 0; }效果{profileData:[{},{type : function,name : void test(void),thread id : 30040,average duration : 1010.000000000ms}]}profiler.h#ifndef __MLX_PROFILER__ #define __MLX_PROFILER__ #include singleton.h #include mlx_profile.h #include chrono #include string #include thread #include mutex #include fstream #include unordered_map #include sstream #include iomanip namespace mlx { using FloatingPointMilliseconds std::chrono::durationdouble, std::milli; struct ProfileResult { std::string name; FloatingPointMilliseconds elapsed_time; std::thread::id thread_id; }; class Profiler : public SingletonProfiler { friend class SingletonProfiler; public: Profiler(const Profiler) delete; Profiler(Profiler) delete; void appendProfileData(ProfileResult result); private: Profiler() { beginRuntimeSession(); } ~Profiler(); void beginRuntimeSession(); void writeProfile(const ProfileResult result); void endRuntimeSession(); inline void writeHeader() { _output_stream {\profileData\:[{}; _output_stream.flush(); } inline void writeFooter() { _output_stream ]}; _output_stream.flush(); } private: std::unordered_mapstd::string, std::pairstd::size_t, ProfileResult _profile_data; std::ofstream _output_stream; std::mutex _mutex; bool _runtime_session_began false; }; class ProfilerTimer { public: ProfilerTimer(const char* name) : _name(name) { _start_timepoint std::chrono::steady_clock::now(); } inline void stop() { auto end_timepoint std::chrono::steady_clock::now(); auto high_res_start FloatingPointMilliseconds{ _start_timepoint.time_since_epoch() }; auto elapsed_time std::chrono::time_point_caststd::chrono::milliseconds(end_timepoint).time_since_epoch() - std::chrono::time_point_caststd::chrono::milliseconds(_start_timepoint).time_since_epoch(); Profiler::get().appendProfileData({ _name, elapsed_time, std::this_thread::get_id() }); _stopped true; } ~ProfilerTimer() { if(!_stopped) stop(); } private: std::chrono::time_pointstd::chrono::steady_clock _start_timepoint; const char* _name; bool _stopped false; }; namespace ProfilerUtils { template std::size_t N struct ChangeResult { char data[N]; }; template std::size_t N, std::size_t K constexpr auto cleanupOutputString(const char(expr)[N], const char(remove)[K]) { ChangeResultN result {}; std::size_t src_index 0; std::size_t dst_index 0; while(src_index N) { std::size_t match_index 0; while(match_index K - 1 src_index match_index N - 1 expr[src_index match_index] remove[match_index]) match_index; if(match_index K - 1) src_index match_index; result.data[dst_index] expr[src_index] ? \ : expr[src_index]; src_index; } return result; } } } #ifdef PROFILER #define MLX_PROFILE_SCOPE_LINE2(name, line) constexpr auto fixedName##line ::mlx::ProfilerUtils::cleanupOutputString(name, __cdecl );\ ::mlx::ProfilerTimer timer##line(fixedName##line.data) #define MLX_PROFILE_SCOPE_LINE(name, line) MLX_PROFILE_SCOPE_LINE2(name, line) #define MLX_PROFILE_SCOPE(name) MLX_PROFILE_SCOPE_LINE(name, __LINE__) #define MLX_PROFILE_FUNCTION() MLX_PROFILE_SCOPE(MLX_FUNC_SIG) #else #define MLX_PROFILE_SCOPE(name) #define MLX_PROFILE_FUNCTION() #endif #endifprofiler.cpp#include profiler.h #include errors.cpp #include iostream namespace mlx { void Profiler::beginRuntimeSession() { std::lock_guard lock(_mutex); if(_runtime_session_began) return; _output_stream.open(./runtime_profile.mlx.json, std::ofstream::out | std::ofstream::trunc); if(_output_stream.is_open()) writeHeader(); else core::error::report(e_kind::error, Profiler : cannot open runtime profile file); _runtime_session_began true; } void Profiler::appendProfileData(ProfileResult result) { std::lock_guard lock(_mutex); auto it _profile_data.find(result.name); if(it ! _profile_data.end()) { result.elapsed_time (result.elapsed_time it-second.second.elapsed_time) / it-second.first; _profile_data[result.name].first; _profile_data[result.name].second result; } else _profile_data[result.name] std::make_pair(1, result); } void Profiler::writeProfile(const ProfileResult result) { std::stringstream json; json std::setprecision(9) std::fixed; json ,\n{\n; json \t\type\ : \function\, \n; json \t\name\ : \ result.name \, \n; json \t\thread id\ : result.thread_id , \n; json \t\average duration\ : \ result.elapsed_time.count() ms\\n; json }; _output_stream json.str(); } void Profiler::endRuntimeSession() { std::lock_guard lock(_mutex); if(!_runtime_session_began) return; for(auto [_, pair] : _profile_data) writeProfile(pair.second); writeFooter(); _output_stream.close(); _profile_data.clear(); _runtime_session_began false; } Profiler::~Profiler() { if(!_runtime_session_began) return; endRuntimeSession(); } }创作不易小小的支持一下吧
企业数字化 ERP 产品动态
相关推荐
C++几何运算库GEOS /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 19:10:47
C++安全密码生成与强度检测 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 3:37:04
15分钟生成OpenCore EFI:OpCore-Simplify入门指南 15分钟生成OpenCore EFI:OpCore-Simplify入门指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify
你有一台2023年的台式机,想装… · 2026/11/5 8:53:54
电工证不复审会作废保姆级教程 电工证不复审会作废保姆级教程 证书过期了不知道怎么复审延期?别慌,今天就给你讲明白电工证不复审会作废的真相,还有保姆级教程带你一步步搞定复审和续期,避免被查、被罚、被限制从业。 为什么电工证不复审会作废? 电工证… · 2026/11/7 19:10:38
将乐电工证怎么考通过率揭秘:证书过期了不知道怎么复审延期? 将乐电工证怎么考通过率揭秘:证书过期了不知道怎么复审延期? 证书过期了不知道怎么复审延期?这是很多从事电工行业的朋友最头疼的问题之一。尤其是像将乐这样的地方,电工证不仅关系到你的职业发展,更是关系到你能否继续从事相关工作。但很多人在证书快到… · 2026/11/7 19:10:38
电工证年审要培训,官方回应来了,工地太忙根本没时间复习考试 电工证年审要培训,官方回应来了,工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这是很多特种作业人员,特别是电工证持有者的普遍焦虑。尤其是涉及到 电工证年审要培训 的问题,不少人都在问: 年审真的要参加培训吗?… · 2026/11/7 19:10:38
国网公司电工证考试千万别踩坑,证书过期了不知道怎么复审延期 国网公司电工证考试千万别踩坑,证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,这事儿真不是小问题,尤其是在国网公司电工证考试这种对流程和细节要求极高的行业。很多人都因为一个疏忽,导致证书失效,不仅影响工作,还可能面临罚款甚至被追… · 2026/11/7 19:10:38
电工作业防护服要求通过率揭秘:信阳浉河区水利从业者必看 电工作业防护服要求通过率揭秘:信阳浉河区水利从业者必看 怕考不过白交培训费?电工作业防护服要求是特种作业考试中最容易被忽视但又最容易扣分的部分。尤其在信阳浉河区水利工程项目上,不少电工因为防护服穿戴不当直接被判定考试不合格。今天就来揭秘电工… · 2026/11/7 19:10:38
苏州市电工证怎么查内部消息全公开 电工证过期了别慌 苏州市电工证怎么查内部消息全公开 电工证过期了别慌 证书过期了不知道怎么复审延期?你不是一个人。现在苏州市电工证的审核和复审流程正在收紧,很多人因为不了解最新规定,白白丢了工作机会,甚至被单位辞退。尤其是像安阳房建工程这类经常涉及电气作业的… · 2026/11/7 19:09:37
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23