C/C++ 编程小工具
编写了 tools.h
和 tools.cpp
,用于 Debug、性能测试、打印日志。
tools.h
#ifndef TOOLS_H
#define TOOLS_H#include <time.h>
#include <fstream>
#include <iostream>
#include <random>
#include <chrono>
#include <vector>
#include <algorithm>using namespace std;// 换行
#define pn puts("")// 代码位置
#define where printf("File: %s, Line: %d, Function: %s. ", __FILE__, __LINE__, __FUNCTION__)// 打印错误
#define ErrorInfo(format, ...) \{ \printf("[Error] "); \where; \printf(format, ##__VA_ARGS__); \pn; \}// 捕获异常
#define Try(code) \try \{ \code; \} \catch (const std::exception &e) \{ \std::cerr << "Catch exception: " << e.what() << std::endl; \where; \return -1; \}// 日志文件
#define LOGFILE "Log.txt"// 写日志
#define Log(str) PrintLog(str, __FILE__, __LINE__, __FUNCTION__);/*** @brief 打印日志文件*/
void PrintLog(char *str, const char *FILE, const int LINE, const char *FUNCTION);// #######################################################################################################extern std::chrono::steady_clock::time_point TM_start, TM_end; // 记录时钟周期
extern std::vector<int64_t> TM_mem; // 存储循环测试结果#define To_ns(dur) std::chrono::duration_cast<std::chrono::nanoseconds>(dur).count() // clock -> ns
#define To_us(dur) std::chrono::duration_cast<std::chrono::microseconds>(dur).count() // clock -> us
#define To_ms(dur) std::chrono::duration_cast<std::chrono::milliseconds>(dur).count() // clock -> ms// 计时器
#define Timer(str, code) \TM_start = std::chrono::steady_clock::now(); \code; \TM_end = std::chrono::steady_clock::now(); \printf("Running Time of <%s>:\t%15.6f ms\n", \str, double(To_ns(TM_end - TM_start)) / 1000000);// 循环测试
#define Loop(loop, str, code) \TM_mem.resize(loop, 0); \for (int __i = 0; __i < loop; __i++) \{ \TM_start = std::chrono::steady_clock::now(); \{ \code; \} \TM_end = std::chrono::steady_clock::now(); \TM_mem[__i] = To_ns(TM_end - TM_start); \} \Analyis_TM(loop, str);void Analyis_TM(int loop, const char *str); // 分析代码性能// #######################################################################################################/*** @brief 自定义分配器,确保内存块是 32 字节对齐的*/
template <typename T>
class AlignedAllocator
{
public:using value_type = T;using pointer = T *;using const_pointer = const T *;using reference = T &;using const_reference = const T &;using size_type = std::size_t;using difference_type = std::ptrdiff_t;template <typename U>struct rebind{using other = AlignedAllocator<U>;};pointer allocate(size_type n){return static_cast<pointer>(std::aligned_alloc(32, n * sizeof(T)));}void deallocate(pointer p, size_type) noexcept{std::free(p);}
};/*** @brief 具有 32-Btyes 对齐的内存*/
typedef vector<int32_t, AlignedAllocator<int32_t>> AlignedVcetor;#endif // TOOLS_H
tools.cpp
#include "tools.h"void PrintLog(char *str, const char *FILE, const int LINE, const char *FUNCTION)
{fstream fout;fout.open(LOGFILE, ios::out | ios::app); // 追加if (fout.is_open()){time_t timep;time(&timep); // 获取从1970至今过了多少秒string t(ctime(&timep)); // 秒数转化成字符串格式,格式:Tue Oct 8 16:15:42 2024fout << t; // 记录时间fout << "File: " << FILE << ", Line: " << LINE<< ", Function: " << FUNCTION << ". "; // 记录位置fout << str << endl; // 记录日志信息fout.flush(); // 立即写fout.close();}else{ErrorInfo("Failed to open the file %s.", LOGFILE);}
}//########################################################################################################std::chrono::steady_clock::time_point TM_start{}, TM_end{};
std::vector<int64_t> TM_mem{};void Analyis_TM(int loop, const char *str)
{int64_t min, max, med, aver = 0;auto lt = [](int64_t a, int64_t b){ return (a < b); };std::sort(TM_mem.data(), TM_mem.data() + loop, lt);min = TM_mem[0];max = TM_mem[loop - 1];med = TM_mem[loop >> 1];for (int i = 0; i < loop; i++){aver += TM_mem[i];}aver /= loop;printf("Running Time of <%s>:\n\tLoop\t%10d times\n""\tMinimum\t%15.6f ms\n""\tMaximum\t%15.6f ms\n""\tMedian\t%15.6f ms\n""\tAverage\t%15.6f ms\n",str, loop,double(min) / 1000000, double(max) / 1000000,double(med) / 1000000, double(aver) / 1000000);
}
相关文章:
C/C++ 编程小工具
编写了 tools.h 和 tools.cpp,用于 Debug、性能测试、打印日志。 tools.h #ifndef TOOLS_H #define TOOLS_H#include <time.h> #include <fstream> #include <iostream> #include <random> #include <chrono> #include <vector&…...
第四十二章 使用 WS-ReliableMessaging
文章目录 第四十二章 使用 WS-ReliableMessaging从 Web 客户端发送一系列消息 第四十二章 使用 WS-ReliableMessaging IRIS 支持 WS-ReliableMessaging 规范的部分内容,如简介中所述。此规范提供了一种按顺序可靠地传递一系列消息的机制。本页介绍如何手动使用可靠…...

利士策分享,婚姻为何被称为大事?
利士策分享,婚姻为何被称为大事? 在历史的长河中,婚姻一直被视为人生中的头等大事,这一观念跨越时空,深深植根于各种文化和社会结构中。 古人为何将婚姻称为“大事”,这背后蕴含着丰富的社会、文化和心理寓…...

malloc源码分析之 ----- 你想要啥chunk
文章目录 malloc源码分析之 ----- 你想要啥chunktcachefastbinsmall binunsorted binbin处理top malloc源码分析之 ----- 你想要啥chunk tcache malloc源码,这里以glibc-2.29为例: void * __libc_malloc (size_t bytes) {mstate ar_ptr;void *victim;vo…...

软考系统分析师知识点五:数据通信与计算机网络
前言 今年报考了11月份的软考高级:系统分析师。 考试时间为:11月9日。 倒计时:32天。 目标:优先应试,其次学习,再次实践。 复习计划第一阶段:扫平基础知识点,仅抽取有用信息&am…...

windows客户端SSH连接ubuntu/linux服务器,三种网络连接:局域网,内网穿透(sakuraftp),虚拟局域网(zerotier)
windows客户端SSH连接ubuntu/linux服务器,三种网络连接:局域网,内网穿透(sakuraftp),虚拟局域网(zerotier) 目录 SSH简述、三种网络连接特点SSH简述局域网内连接内网穿透(…...

Python 工具库每日推荐【openpyxl 】
文章目录 引言Python Excel 处理库的重要性今日推荐:openpyxl 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成月度销售报告案例分析高级特性条件格式数据验证扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计…...

本地生活服务项目入局方案解析!本地生活服务商系统能实现怎样的作业效果?
当前,各大平台的本地生活服务业务日渐兴盛,提高创业者入局意向的同时,也让本地生活服务项目有哪些等问题也成为了多个创业者社群中的热议对象。而从目前的讨论情况来看,在创业者们所询问的众多本地生活服务项目中,通过…...

ML 系列:【13 】— Logistic 回归(第 2 部分)
文章目录 一、说明二、挤压方法三、Logistic 回归中的损失函数四、后记 一、说明 在这篇文章中,我们将深入研究 squashing 方法,这是有符号距离方法(第 12节)的一种很有前途的替代方案。squashing 方法通过提供增强的对异常值…...

45岁被裁员的程序员,何去何从?
在当今快速变化的技术行业,职业生涯的稳定性受到挑战。在45岁被裁员,对很多程序员来说,可能是一种惊慌失措的体验。然而,这个阶段也可以被视为一个重新审视和调整方向的机会。本文将对可能的出路进行全方位的分析,并提…...

云计算Openstack Neutron
OpenStack Neutron是OpenStack云计算平台中的网络服务组件,它为OpenStack提供了强大的网络连接功能。 一、基本概念 Neutron是一个网络服务项目,旨在为OpenStack提供网络连接。它允许用户创建和管理虚拟网络,包括子网、路由、安全组等&…...

PointNet++网络详解
数据集转换 数据集转换的意义在于将原本的 txt 点云文件转换为更方便运算的npy点云文件,同时,将原本的xyzrgb这 6 个维度转换为xyzrgbc,最后一个c维度代表该点云所属的类别。 for anno_path in anno_paths:print(anno_path)try:elements a…...

Java | Leetcode Java题解之第459题重复的子字符串
题目: 题解: class Solution {public boolean repeatedSubstringPattern(String s) {return kmp(s s, s);}public boolean kmp(String query, String pattern) {int n query.length();int m pattern.length();int[] fail new int[m];Arrays.fill(fa…...
【动态规划-最长公共子序列(LCS)】【hard】力扣1092. 最短公共超序列
给你两个字符串 str1 和 str2,返回同时以 str1 和 str2 作为 子序列 的最短字符串。如果答案不止一个,则可以返回满足条件的 任意一个 答案。 如果从字符串 t 中删除一些字符(也可能不删除),可以得到字符串 s &#x…...

图片编辑为底片,智能工具助力,创作精彩视觉作品
在当今数字化时代,图像编辑已成为表达创意和美化视觉作品的重要手段。借助智能工具,即使是初学者也能轻松驾驭图片编辑。接下为大家展示图片编辑为底片图片的效果。 1.打开“首助编辑高手”,选择这里“图片批量处理”版块页面上 2.导入保存有…...

机器学习/数据分析--用通俗语言讲解时间序列自回归(AR)模型,并用其预测天气,拟合度98%+
时间序列在回归预测的领域的重要性,不言而喻,在数学建模中使用及其频繁,但是你真的了解ARIMA、AR、MA么?ACF图你会看么?? 时间序列数据如何构造???,我打过不少…...
回溯算法之值子集和问题详细解读(附带Java代码解读)
子集和问题(Subset Sum Problem) 是一个经典的组合优化问题。问题可以这样描述: 给定一个整数集合和一个目标整数 target,我们需要从集合中选出若干个整数,使它们的和等于 target。如果这样的子集存在,返回…...
mysql游标的使用
说明: 虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是 随意定位到某一条记录 …...
linux udev详解
1.概念介绍 1.1sysfs文件系统 Linux 2.6以后的内核引入了sysfs文件系统,sysfs被看成是与proc、devfs和devpty同类别的文件系统,该文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息…...
EventSource和websocket该用哪种技术
EventSource(也称为Server-Sent Events, SSE)和WebSocket都是实现实时通信的技术,但是它们的设计目的和使用场景有所不同。在选择使用哪种技术时,需要根据具体的应用需求来决定。下面是一些关键点,可以帮助你做出选择&…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...