计时接口(Linux/Cpp)

c 复制代码
/* InterFace/Linux/TimeCal.c */
#include "TimeCal.h"

int startTime(TimeCal *timer)
{
    if (clock_gettime(CLOCK_MONOTONIC, &timer->start) != 0)
    {
        perror("clock_gettime");
        return -1;
    }

    return 0;
}

int stopTime(TimeCal *timer)
{
    if (clock_gettime(CLOCK_MONOTONIC, &timer->end) != 0)
    {
        perror("clock_gettime");

        return -1;
    }
    return 0;
}

long getElapsedTime(const TimeCal *timer, int unit)
{
    long seconds = timer->end.tv_sec - timer->start.tv_sec;
    long nanoseconds = timer->end.tv_nsec - timer->start.tv_nsec;

    switch (unit)
    {
    case 1: // 返回秒
        return seconds;
    case 2: // 返回毫秒
        return seconds * 1000 + nanoseconds / 1000000;
    case 3: // 返回微秒
        return seconds * 1000000 + nanoseconds / 1000;
    default:
        return -1; // 无效的单位
    }
}

void timeUsleep(unsigned int time)
{
    usleep(time);
}
c 复制代码
/* InterFace/Linux/TimeCal.h */
#pragma once
#include <stdio.h>
#include <time.h>
#include <unistd.h> 
#include <memory.h> 

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _TIME_TYPE
{
    _SECONDS = 1,
    _MILLISECONDS,
    _MICROSECONDS
}TIME_TYPE;

typedef struct _TimeCal
{
    struct timespec start;
    struct timespec end;
}TimeCal;

extern int startTime(TimeCal *timer);
extern int stopTime(TimeCal *timer);
long getElapsedTime(const TimeCal *timeCal, int unit);
extern void timeUsleep(unsigned int time);

#ifdef __cplusplus
}
#endif
c 复制代码
/* InterFace/Cpp/TimeCal.c */
#include "TimeCal.h"

int startTime(TimeCal *timeCal)
{
    timeCal->start = std::chrono::steady_clock::now();
    return 0;
}

int stopTime(TimeCal *timeCal)
{
    timeCal->end = std::chrono::steady_clock::now();
    return 0;
}

long getElapsedTime(const TimeCal *timeCal, int unit)
{
    using namespace std::chrono;

    auto duration = timeCal->end - timeCal->start;

    switch (unit)
    {
    case 1: // 返回秒
        return duration_cast<seconds>(duration).count();
    case 2: // 返回毫秒
        return duration_cast<milliseconds>(duration).count();
    case 3: // 返回微秒
        return duration_cast<microseconds>(duration).count();
    default:
        return -1; // 无效的单位
    }
}

void timeUsleep(unsigned int time)
{
    std::this_thread::sleep_for(std::chrono::microseconds(time));
}
c 复制代码
/* InterFace/Cpp/TimeCal.h */
#pragma once

#include <stdio.h>
#include <time.h>
#include <memory.h>

#include <iostream>
#include <chrono>
#include <thread>

typedef enum _TIME_TYPE
{
    _SECONDS = 1,
    _MILLISECONDS,
    _MICROSECONDS
}TIME_TYPE;

typedef struct _TimeCal
{
    std::chrono::steady_clock::time_point start;
    std::chrono::steady_clock::time_point end;
} TimeCal;

extern int startTime(TimeCal *timer);
extern int stopTime(TimeCal *timer);
long getElapsedTime(const TimeCal *timeCal, int unit);
extern void timeUsleep(unsigned int time);
c 复制代码
/* InterFace.h */
#pragma once

/* Cmake input */
// #define _USE_LINUX 1
// #if _USE_LINUX
// #define _USE_CPP 0
// #else
// #define _USE_CPP 1
// #endif

#if _USE_LINUX
#include "InterFace/Linux/TimeCal.h"
#elif _USE_CPP
#include "InterFace/Cpp/TimeCal.h"
#endif
c 复制代码
/* main.c */
#include "InterFace.h"

int main()
{
    TimeCal timer;
    memset(&timer, 0, sizeof(timer));

    int unit = _MICROSECONDS; // 选择时间单位:1-秒,2-毫秒,3-微秒

    startTime(&timer);
    timeUsleep(1000000);
    stopTime(&timer);

    long elapsed_time = getElapsedTime(&timer, unit);

    if (elapsed_time >= 0)
    {
        printf("Time taken: %ld %s\n", elapsed_time, (unit == 1) ? "seconds" : ((unit == 2) ? "milliseconds"
                                                                                           : "microseconds"));
    }
    else
    {
        printf("Invalid time unit selected.\n");
    }

    return 0;
}
bash 复制代码
cmake_minimum_required(VERSION 3.5)
project(MyProject)
set(CMAKE_VERBOSE_MAKEFILEON)
add_compile_options(-std=c++11 -Wall)

# 添加条件语句,选择不同路径下的源文件
if (_USE_LINUX)
    add_definitions(-D_USE_LINUX=1)
    file(GLOB SOURCE_FILES main.c InterFace/Linux/*.c)
#    set(SOURCE_FILES main.c InterFace/Linux/TimeCal.c)
#elseif (_USE_CPP)
#    add_definitions(-D_USE_CPP=1)
#    set(SOURCE_FILES main.c InterFace/Cpp/TimeCal.c)
else()
    add_definitions(-D_USE_CPP=1)
    file(GLOB SOURCE_FILES main.c InterFace/Cpp/*.c)
endif()

# 设置可执行文件的输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build)

# 添加源文件
add_executable(MyExecutable ${SOURCE_FILES})

# 添加包含路径
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR})
相关推荐
梦帮科技1 小时前
Web 漏洞攻防深度:WAF 规则逃逸技术(畸形分块传输、双重编码)与对抗加固
linux·前端·网络安全·ssl·web
for_ever_love__1 小时前
忠实度(Faithfulness):怎么判断 RAG 的答案有没有瞎编
linux·rag·评估·答案·faithfulness·原文·忠实度
程序员-Benothing1 小时前
Linux系统监控工具全家桶:sar、dstat、glances、Prometheus
linux·运维·prometheus
栈帧之外1 小时前
【C++】红黑树实现
开发语言·c++
程序员老陆1 小时前
C++中同一个回调函数被多个设备并发调用:并发问题不在“函数”,而在“状态”
开发语言·c++·程序设计
辛苦才能2 小时前
C++ unordered_map/set 深度解析:快在O(1),输在无序,与map/set怎么选
c++·哈希算法·散列表
瑞克-桑切斯3 小时前
13、DNS、DHCP 与 FTP 协议详解
linux·运维·云计算
程序员-Benothing3 小时前
Linux性能分析方法论:USE、RED、火焰图与perf实战
linux·运维·服务器
云中双月3 小时前
瑞芯微rv1106进入Loader模式转储emmc数据
linux·嵌入式·uboot·u-boot·emmc·rockchip·烧录·rv1106·瑞芯微
yunwei373 小时前
eBPF 入门实践教程:BPF Token,安全的委托式权限与程序加载
linux·后端·性能优化