C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

news2024/11/22 11:03:19

昨晚一直内耗,一个程序写了三天写不出来,主要是耗时太多了,老板一直不满意。想在VScode上跑一下,昨晚一直报错。今天来公司重新搞了一下,

主要工作有:

1,读取当前时间用tscns

2,输出不用cout用fmt::print或者logi输出

3,ns到北京时间转换用fmtlog.h文件中的方式算出来

4,把昨天晚上上传gitee的文件删掉,重新上传

5,写一个100万次的循环,测试输出时间,给出最大最小值,中位数,标准差,统计各个时间阶段的百分比

如何缩短输出时间:

老板要求从获取时间到时间转化到输出时间,所有的时间在几百ns内,但是我只读取时间然后转化就几百ns,打印时间耗费时间更多,和老板沟通过后,老板说先传到git看看,并且封装成函数,输入0,1,2分别给出获取一次时间,转化为北京时间和总共时间,我今天改的代码:

#include <iostream>
#include <chrono>
#include "../fmtlog.h"
#include "../fmtlog-inl.h" // 假设 TSCNS 类定义在 fmtlog-inl.h 中

// 函数根据模式返回不同的时间统计结果
int get_time(int mode) {
    // 创建 TSCNS 实例并初始化
    fmtlog::TSCNS tscns;
    tscns.init();
    fmtlogDetailT<> fmtlog;

    int64_t tsc = tscns.rdns();
    int64_t tsc1 = tscns.rdns();

    // 调用 resetDate 获取午夜时间戳
    uint64_t midnightNs = fmtlog.midnightNs;

    // 测量输出北京时间的耗时
    int64_t tsc2 = tscns.rdns();
    uint64_t t = (static_cast<uint64_t>(tsc) > midnightNs)
                 ? (static_cast<uint64_t>(tsc) - midnightNs)
                 : 0;

    uint64_t nanoseconds = t % 1000000000;
    t /= 1000000000;
    uint64_t seconds = t % 60;
    t /= 60;
    uint64_t minutes = t % 60;
    t /= 60;
    uint32_t hours = t;

    if (hours > 23) {
        hours %= 24;
        fmtlog.resetDate();
    }
    int64_t tsc3 = tscns.rdns();

    // 输出格式化的北京时间
    fmt::print("Beijing Time: {:02}{:02}{:02}{:09} ns\n", hours, minutes, seconds, nanoseconds);
    int64_t tsc4 = tscns.rdns();
    // 计算获取时间和格式化所用的时间
    int64_t duration_get_ns = tsc1 - tsc;
    int64_t duration_format_ns = tsc3 - tsc2;
    int64_t duration_print_ns = tsc4 - tsc3;

    // 根据模式返回不同的结果
    if (mode == 0) {
        fmt::print("Time taken to retrieve time: {} ns\n", duration_get_ns);
        return int(duration_get_ns);
    } else if (mode == 1) {
        fmt::print("Time taken to format and output Beijing time: {} ns\n", duration_format_ns);
        return int(duration_format_ns);
    } else if (mode == 2) {
        int total_time = int(duration_print_ns+duration_format_ns);
        fmt::print("Total time: {} ns\n", total_time);
        return total_time;
    } else {
        fmt::print("Invalid mode. Please enter 0, 1, or 2.\n");
        return -1;
    }
}

int main() {
    int mode;
    std::cout << "Enter mode (0: Retrieve time, 1: Format time, 2: Total time): ";
    std::cin >> mode;

    int result = get_time(mode);
    if (result != -1) {
        fmt::print("Result: {} ns\n", result);
    }
    return 0;
}

 1,用TSCNS获取时间比直接用std::chrono::high_resolution_clock::now()快

我直接用了

int64_t timestamp_ns = tn.rdns();

2,用logi输出和用fmt::print

按道理logi比fmt::print快,但是fmtlog的logi有初始定义所以,我修改了logi的宏定义,但其实我觉得两中print方法差不多,都很慢,量级在几万ns,老板说我最早的时候用的

std::setw(2) << std::setfill('0')会更慢

用release跑比用 debug模式跑会快(这个我之前也了解过,但是Clion怎么设置release模式不太会,我自己设置了一下,但是不知道对不对,后面服务器满了我想着删掉点东西,结果误删了cmake-Debug,文件后面跑一直报错,然后我重新github上下载了一下-_-!)

如何写测试文件:

老板让我多测试测试,我昨天只设置了100次循环,他说太少了,所以我设置了100万次循环:

代码: 

/*
 * 测试文件获取当前时间,并转化为北京时间的时间分布,以及获取一次时间并加上转化时间的时间间隔
 * 计算最大时间,最小时间,标准差,中位数,将时间按0-50,50-100,100-150,150-200分类
 * 测试次数100万次
 * */
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <numeric>
#include "../fmtlog.h"
#include "../fmtlog-inl.h" // 假设 TSCNS 类定义在 fmtlog-inl.h 中

int main() {
    // 创建 TSCNS 实例并初始化
    fmtlog::TSCNS tscns;
    tscns.init();
    fmtlogDetailT<> fmtlog;

    const int num_iterations = 1000000;

    // 存储每次获取时间和格式化时间的耗时
    std::vector<int64_t> retrieve_times;
    std::vector<int64_t> format_times;
    std::vector<int64_t> all_times;

    // 存储分布统计
    std::vector<int> retrieve_time_buckets(5, 0);
    std::vector<int> format_time_buckets(5, 0);
    std::vector<int> all_time_buckets(5, 0);

    for (int i = 0; i < num_iterations; ++i) {
        // 测量获取时间的耗时
        int64_t tsc_start_get = tscns.rdns();
        int64_t tsc_end_get = tscns.rdns();
        int64_t duration_get_ns = tsc_end_get - tsc_start_get;
        retrieve_times.push_back(duration_get_ns);

        // 统计获取时间的分布
        if (duration_get_ns <= 50) retrieve_time_buckets[0]++;
        else if (duration_get_ns <= 100) retrieve_time_buckets[1]++;
        else if (duration_get_ns <= 150) retrieve_time_buckets[2]++;
        else if (duration_get_ns <= 200) retrieve_time_buckets[3]++;
        else retrieve_time_buckets[4]++;

        // 测量格式化北京时间的耗时
        int64_t tsc_start_format = tscns.rdns();
        uint64_t tsc = tscns.rdns();
        uint64_t t = (static_cast<uint64_t>(tsc) > fmtlog.midnightNs)
                     ? (static_cast<uint64_t>(tsc) - fmtlog.midnightNs)
                     : 0;

        uint64_t nanoseconds = t % 1000000000;
        t /= 1000000000;
        uint64_t seconds = t % 60;
        t /= 60;
        uint64_t minutes = t % 60;
        t /= 60;
        uint32_t hours = t;

        if (hours > 23) {
            hours %= 24;
            fmtlog.resetDate();
        }
        int64_t tsc_end_format = tscns.rdns();
        int64_t duration_format_ns = tsc_end_format - tsc_start_format;
        format_times.push_back(duration_format_ns);

        // 统计格式化时间的分布
        if (duration_format_ns <= 50) format_time_buckets[0]++;
        else if (duration_format_ns <= 100) format_time_buckets[1]++;
        else if (duration_format_ns <= 150) format_time_buckets[2]++;
        else if (duration_format_ns <= 200) format_time_buckets[3]++;
        else format_time_buckets[4]++;

        // 统计总时间
        int64_t all_time = duration_get_ns + duration_format_ns;
        all_times.push_back(all_time);
        if (all_time <= 50) all_time_buckets[0]++;
        else if (all_time <= 100) all_time_buckets[1]++;
        else if (all_time <= 150) all_time_buckets[2]++;
        else if (all_time <= 200) all_time_buckets[3]++;
        else all_time_buckets[4]++;
    }

    // 计算统计数据
    auto calculate_stats = [](const std::vector<int64_t>& times) {
        int64_t min_time = *std::min_element(times.begin(), times.end());
        int64_t max_time = *std::max_element(times.begin(), times.end());
        double mean = std::accumulate(times.begin(), times.end(), 0.0) / times.size();

        double sq_sum = std::inner_product(times.begin(), times.end(), times.begin(), 0.0,
                                           std::plus<>(), [mean](double x, double y) { return (x - mean) * (y - mean); });
        double std_dev = std::sqrt(sq_sum / times.size());

        std::vector<int64_t> sorted_times = times;
        std::sort(sorted_times.begin(), sorted_times.end());
        int64_t median = sorted_times[times.size() / 2];

        return std::make_tuple(min_time, max_time, mean, std_dev, median);
    };

    // 输出统计数据
    auto [retrieve_min, retrieve_max, retrieve_mean, retrieve_std_dev, retrieve_median] = calculate_stats(retrieve_times);
    auto [format_min, format_max, format_mean, format_std_dev, format_median] = calculate_stats(format_times);
    auto [all_min, all_max, all_mean, all_std_dev, all_median] = calculate_stats(all_times);

    fmt::print("Retrieve Time Stats:\n");
    fmt::print("Min: {} ns, Max: {} ns, Mean: {:.2f} ns, Std Dev: {:.2f} ns, Median: {} ns\n",
               retrieve_min, retrieve_max, retrieve_mean, retrieve_std_dev, retrieve_median);

    fmt::print("\nFormat Time Stats:\n");
    fmt::print("Min: {} ns, Max: {} ns, Mean: {:.2f} ns, Std Dev: {:.2f} ns, Median: {} ns\n",
               format_min, format_max, format_mean, format_std_dev, format_median);

    fmt::print("\nAll Time Stats:\n");
    fmt::print("Min: {} ns, Max: {} ns, Mean: {:.2f} ns, Std Dev: {:.2f} ns, Median: {} ns\n",
               all_min, all_max, all_mean, all_std_dev, all_median);

    // 计算分布百分比
    auto calculate_percentage = [&](const std::vector<int>& buckets) {
        std::vector<double> percentages(buckets.size());
        for (size_t i = 0; i < buckets.size(); ++i) {
            percentages[i] = static_cast<double>(buckets[i]) / num_iterations * 100.0;
        }
        return percentages;
    };

    auto retrieve_percentages = calculate_percentage(retrieve_time_buckets);
    auto format_percentages = calculate_percentage(format_time_buckets);
    auto all_percentages = calculate_percentage(all_time_buckets);

    fmt::print("\nRetrieve Time Distribution (Count and %):\n");
    for (size_t i = 0; i < retrieve_percentages.size(); ++i) {
        fmt::print("Bucket {}: Count = {}, Percentage = {:.2f}%\n", i, retrieve_time_buckets[i], retrieve_percentages[i]);
    }

    fmt::print("\nFormat Time Distribution (Count and %):\n");
    for (size_t i = 0; i < format_percentages.size(); ++i) {
        fmt::print("Bucket {}: Count = {}, Percentage = {:.2f}%\n", i, format_time_buckets[i], format_percentages[i]);
    }

    fmt::print("\nAll Time Distribution (Count and %):\n");
    for (size_t i = 0; i < all_percentages.size(); ++i) {
        fmt::print("Bucket {}: Count = {}, Percentage = {:.2f}%\n", i, all_time_buckets[i], all_percentages[i]);
    }

    return 0;
}

结果: 

 为什么最短时间和最长时间相差很多:

老板说是因为没有绑核,所以输出不稳定,然后给了我一个绑核的代码:

cpu_set_t cpu_mask;
CPU_ZERO(&cpu_mask);
CPU_SET(mp_tdMgr->m_queryCpuCore, &cpu_mask);
// 设置对应的线程核心
int ret = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpu_mask);
if (ret != 0) {
    loge("[PsiSubTrader] Trader Run Worker thread affinity failed! ret:{}", ret);
} else {
    logi("[PsiSubTrader] Trader Run Worker thread affinity success! cpu core:{}", mp_tdMgr->m_queryCpuCore);
}

如何删除gitee提交的文件

 昨天晚上提交的文件fmtlog里面有.git文件,这样的话会导致gitee仓库那边打不开提交的文件,先删除远程仓库里的错误文件:

两种方法:

1,右键单击文件然后弹出选项选择删除

2,本地操作 ,利用git,cd进库文件夹——>dir会显示当前文件夹下的文件——>git rm -r --cached 待删除的文件名如:git rm -r --cached fmtlog——>git commit -m "删除了文件fmtlog"——>git push

要注意,提交到仓库的文件里面不能有.git(我提交的文件fmtlog和fmt里面都有.git,所以往gitee仓库里面提交了好多次-_-!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2244618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从零开始的LeetCode-算法】3301. 高度互不相同的最大塔高和

给你一个数组 maximumHeight &#xff0c;其中 maximumHeight[i] 表示第 i 座塔可以达到的 最大 高度。 你的任务是给每一座塔分别设置一个高度&#xff0c;使得&#xff1a; 第 i 座塔的高度是一个正整数&#xff0c;且不超过 maximumHeight[i] 。所有塔的高度互不相同。 请…

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步&#xff0c;就有非常多的坑&#xff0c;一些常见的坑&#xff0c;官网都有介绍&#xff0c;就不再拿出来了&#xff0c;这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法&#xff1a; Windows系统&#xff0c;官…

基于UDP和TCP实现回显服务器

目录 一. UDP 回显服务器 1. UDP Echo Server 2. UDP Echo Client 二. TCP 回显服务器 1. TCP Echo Server 2. TCP Echo Client 回显服务器 (Echo Server) 就是客户端发送什么样的请求, 服务器就返回什么样的响应, 没有任何的计算和处理逻辑. 一. UDP 回显服务器 1. UD…

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标&#xff1a; 处理键盘输入&#xff1a;将键盘输入的处理逻辑从平台特定的代码中分离出来&#xff0c;放入更独立的函数中以便管理。优化消息循环&#xff1a;确保消息循环能够有效处理 …

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号&#xff1a;正点原子的IMX6ULL-alpha开发板。ubuntu版本为&#xff1a;20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯&#xff0c;可以通过read系统调用可以…

论文阅读 SeedEdit: Align Image Re-Generation to Image Editing

目录 摘要 1 INTRODUCTION 2 SEEDEDIT 2.1 T2I MODEL FOR EDITING DATA GENERATION 2.2 CAUSAL DIFFUSION MODEL WITH IMAGE INPUT 2.3 ITERATIVE ALIGNMENT 3 EXPERIMENTS 3.1 BENCHMARK AND METRICS 3.2 IMAGE EDITING COMPARISON 4 CONCLUSION 摘要 SeedEdit&…

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量&#xff0c;那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半&#xff0c;这样剩下的就是一半的质量 目标和 给定一个非负整数数组&#xff0c;a1, a2, …, an, 和一个目标数&#xff0c;S。现在你有…

【C++】绘制内存管理的地图

生活是属于每个人自己的感受&#xff0c;不属于任何人的看法。 前言 这是我自己学习C的第二篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的类与对象础知识&#xff0c;没看的同学可以过去看看&#xff1a; 【C】面向对象编程的艺术之旅-CSDN博客https…

【AI大模型引领变革】探索AI如何重塑软件开发流程与未来趋势

文章目录 每日一句正能量前言流程与模式介绍【传统软件开发 VS AI参与的软件开发】一、传统软件开发流程与模式二、AI参与的软件开发流程与模式三、AI带来的不同之处 结论 AI在软件开发流程中的优势、挑战及应对策略AI在软件开发流程中的优势面临的挑战及应对策略 结论 后记 每…

前端访问后端实现跨域

背景&#xff1a;前端在抖音里做了一个插件然后访问我们的后端。显然在抖音访问其他域名肯定会跨域。 解决办法&#xff1a; 1、使用比较简单的jsonp JSONP 优点&#xff1a;JSONP 是通过动态创建 <script> 标签的方式加载外部数据&#xff0c;属于跨域数据请求的一种…

《Vue零基础入门教程》第二课:搭建开发环境

往期内容&#xff1a; 《Vue零基础入门教程》第一课&#xff1a;Vue简介 1 搭建开发环境 Vue环境分为两种 不使用构建工具使用构建丁具 首先&#xff0c;我们会介绍 不使用构建工具 的环境,在组件化章节中介绍 使用构建工具 的方式 1) 初始化 使用如下指令初始化 npm i…

快速排序【hoare版】

目录 介绍 算法思路 函数实现 函数声明 确定基准值 创建新函数 创建循环找数据&#xff08;right&#xff0c;left&#xff09; 交换左右数据 交换条件设置 外部循坏条件设置 初步总结代码 循环条件完善 内层循环的完善 外层循环的完善 相遇值大于keyi 相遇值等于k…

oracle导入线上数据的全步骤

多租户架构允许oracle数据库成为一个多租户的容器数据库&#xff0c;也就是CDB&#xff0c;container database&#xff0c;与之相对应的&#xff0c;则是插入到这个容器里面的可插拔式数据库&#xff0c;pluggable database 一个CDB可以包含0&#xff0c;1或者多个用户创建的…

嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)

引言&#xff1a;我们在嵌入式硬件杂谈&#xff08;三&#xff09;中有提到阻抗匹配的问题&#xff0c;也引入了高速PCB设计的思想&#xff0c;并且此篇实战基础篇主要是基础的四层板的绘制设计&#xff0c;后续实战会对高速板展开&#xff0c;本篇主要是提升读者的设计PCB板的…

uniapp 选择 省市区 省市 以及 回显

从gitee仓库可以拿到demo 以及 json省市区 文件 // 这是组件部分 <template><uni-popup ref"popup" type"bottom"><view class"popup"><view class"picker-btn"><view class"left" click"…

C语言练习.while语句

题目&#xff1a; 1.用C语言编程&#xff0c;运用while语句&#xff0c;写一段简短的代码。 分析&#xff1a; 1.运用while语句要注意&#xff1a;while语句&#xff0c;要设置好退出条件&#xff0c;不然就会造成无限循环的结果&#xff0c;导致程序停不下来。 2.编写代码…

Linux编辑器 - vim

目录 一、vim 的基本概念 1. 正常/普通/命令模式(Normal mode) 2. 插入模式(Insert mode) 3. 末行模式(last line mode) 二、vim 的基本操作 三、vim 正常模式命令集 1. 插入模式 2. 移动光标 3. 删除文字 4. 复制 5. 替换 6. 撤销上一次操作 7. 更改 8. 调至指定…

24.11.20 sevlet2

1.servlet是否线程安全 (线程特性) 线程安全的指标 //1.是否有共享数据 //2.多线程对共享数据做写操作 servlet中 不要创建成员变量 servlet是单实例的 所以成员变量(不加static) 就会在多线程间共享 如果service()方法中 对成员变量有写操作 则线程不安全 servlet中非特殊情…

【编译器】Dev C++建立C语言工程

【编译器】Dev C建立C语言工程 文章目录 [TOC](文章目录) 前言一、创建工程二、添加.c.h三、主函数处理四、在桌面中打开exe文件五、参考资料总结 前言 在使用了很多编译器之后&#xff0c; 要么是太大了&#xff0c; 要么是太新了&#xff0c; 要么是在线编译器&#xff0c;用…