MCP实战指南:从零构建客户端,并集成本地Ollama模型
2026/4/13 20:12:18
上节回顾:上一讲我们系统讲解了C语言随机数生成与种子管理,包括rand/srand的原理、典型陷阱(如未初始化、重复初始化、模偏差、并发安全)及高质量随机数的选用等。
<time.h>提供了多种时间相关函数,常见的有:time_t time(time_t *t): 获取当前日历时间(秒级)。clock_t clock(void): 通常获取自程序启动以来的CPU时钟计时(单位依赖CLOCKS_PER_SEC)。difftime(): 计算两个time_t的差值(以秒为单位)。gettimeofday()(非标准,POSIX):可获取微秒级时间。timespec_get()(纳秒级,但实现依赖平台)。time()通常粒度为1秒,适合统计大体时间。clock()粒度比time()高,但计量的是CPU占用时间(非真实流逝时间),多用于性能测试,不适合跨多进程或I/O等待场景。gettimeofday()与高精度定时器适合微秒/毫秒级测量。clock()在不同平台可能计量方式不同,有的是CPU耗时,有的是wall clock。time()只能精确到秒,测量亚秒级事件几乎无意义。clock()计量的可能是CPU时间,I/O阻塞期间不计,测量程序总体耗时不准确。time()、gettimeofday()等受系统时间调整影响,系统NTP同步、手动修改时间等都会导致测量时间倒退或跳变,影响准确性。clock()、gettimeofday()等在不同平台、编译器下行为、单位、计量对象可能有本质差异,导致移植时出现误差或不可用。clock()返回clock_t,强转为int或用错误单位计算,易溢出或误差巨大。time_t、struct timeval、struct timespec等类型和单位需明确。time()或difftime()。gettimeofday()(POSIX)、clock_gettime(CLOCK_MONOTONIC)(Linux)。timespec_get(),但部分平台实现有限。clock_gettime(CLOCK_MONOTONIC, ...),Windows用QueryPerformanceCounter()。double或uint64_t等大类型存储总微秒/纳秒,减少溢出风险。get_time_ms()等接口,内部根据平台自动切换最佳API和单位处理。#include<time.h>time_tstart=time(NULL);// ...短暂操作time_tend=time(NULL);printf("耗时: %ld 秒\n",end-start);// 对毫秒级操作无意义#include<sys/time.h>structtimevalstart,end;gettimeofday(&start,NULL);// ...被测代码gettimeofday(&end,NULL);doubleelapsed=(end.tv_sec-start.tv_sec)*1000.0+(end.tv_usec-start.tv_usec)/1000.0;printf("耗时: %.3f 毫秒\n",elapsed);time_ts=time(NULL);// 程序运行时系统时间被修改time_te=time(NULL);printf("耗时: %ld 秒\n",e-s);// 结果可能负数或异常#include<time.h>structtimespect1,t2;clock_gettime(CLOCK_MONOTONIC,&t1);// 被测代码clock_gettime(CLOCK_MONOTONIC,&t2);doubleelapsed=(t2.tv_sec-t1.tv_sec)+(t2.tv_nsec-t1.tv_nsec)/1e9;printf("耗时: %.6f 秒\n",elapsed);clock_tstart=clock();// ...长时间运行clock_tend=clock();intelapsed=end-start;// 大程序可能溢出intclock_tstart=clock();// ...长时间运行clock_tend=clock();doubleelapsed=(double)(end-start)/CLOCKS_PER_SEC;clock()计量的通常是进程CPU时间,非真实挂钟时间(wall time)。I/O阻塞期间不计,适合算法性能测试。gettimeofday()、clock_gettime()计量系统时间或单调时钟,受内核调度、NTP等影响。gettimeofday、clock_gettime等微秒/纳秒级API,并尽量用单调时钟。时间测量不是“小事”,一旦忽视细节,极易出错或得到毫无意义的数据。工程实践中应结合场景选择合适API,并做好跨平台与单位管理,确保准确性和健壮性。
公众号 | FunIO
微信搜一搜 “funio”,发现更多精彩内容。
个人博客 | blog.boringhex.top