- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 unsigned long 来收集性能数据,同时按如下方式分析应用程序
unsigned long time_taken = (unsigned long) ((finish_time_in_nano_sec - start_time_in_nano_sec)/1000);
将 time_taken 写入文件。对我的应用中调用的每个函数执行此操作。
现在在应用程序执行后,让一个单独的程序读取上述文件并总结每个函数所花费的时间,包括调用次数,例如
func_name aggregate_time call_counts
我遇到的问题是,对于某些函数,aggregate_time 字段是一个 20 位数的值,即 unsigned long 可以容纳的最大值。这不可能是真的,因为我以微秒为单位测量时间,并且我的应用程序运行时间不会超过 20 秒。它怎么可能是 20 位数的值?
您看到步骤 1、2 和 3 中的错误了吗?
问候,奎师那
编辑:
1) 时间测量: clock_gettime(CLOCK_REALTIME, &start_time); clock_gettime(CLOCK_REALTIME, &finish_time); unsigned long time_taken = (unsigned long)((finish_time.tv_nsec - art_time.tv_nsec)/1000);
2) 文件写入: fwrite(&time_taken, sizeof(unsigned long), 1, 数据文件);
3) 文件读取: fread(&time_taken, sizeof(long), 1, 数据文件);
最佳答案
问题出在你的时间测量代码中:
clock_gettime(CLOCK_REALTIME, &start_time);
clock_gettime(CLOCK_REALTIME, &finish_time);
unsigned long time_taken = (unsigned long)((finish_time.tv_nsec - start_time.tv_nsec)/1000);
如果在 start_time
和 finish_time
之间跨越 1 秒时钟边界,那么您的减法可能会产生负值,然后将转换为非常大的正无符号值。
您还需要考虑时代的 tv_sec
成员:
unsigned long time_taken;
time_taken = (unsigned long)((finish_time.tv_sec - start_time.tv_sec) * 1000000);
time_taken += (unsigned long)(finish_time.tv_nsec / 1000);
time_taken -= (unsigned long)(start_time.tv_nsec / 1000);
(例如,23989032.452 秒的时钟时间将表示为具有 .tv_sec = 23989032
和 .tv_nsec = 452000000
的 struct timespec
)
关于c++ - 性能分析器 : How to use unsigned long to measure time in microseconds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466379/
我希望以这样的方式对元素进行动画处理,使其每 1 微秒仅向下移动 1 像素,即 0.001 毫秒。 var microsec = 0.001 $("div").animate({top: "+=1px
我正在用 python 编写脚本,我需要知道我的代码中两点之间相隔了多少毫秒。 程序启动时我有一个全局变量是这样的: from datetime import datetime a=datetime.
我知道有毫秒 (Sleep(milli)) 但是我找不到一个用于微型.. 最佳答案 VS 11 开发预览包括处理线程的标准库部分。所以现在你可以说: std::this_thread::sleep_f
In [25]: datetime.fromtimestamp(15179052980380002/10000000) Out[25]: datetime.datetime(2018, 2, 6, 1
我在我的 centos 7 服务器中调用这个函数。 我发现std::this_thread::sleep_for(chrono::nanoseconds(1))实际上 sleep 了一毫秒,有什么解释
在 libc++ 中,std::chrono::microseconds 定义为 std::chrono::duration 对于 64 位平台,long long 定义导致了与 int64_t 的许
我需要在32位系统的android系统的linux内核中以微秒为单位获取64位的时间戳值 是否有直接的内核导出函数调用来实现它? 我看到 64 位的 jiffies,并且有将 64 位的 jiffie
我想使用 Perl 和/或 Python 来实现以下 JavaScript 伪代码: var c=0; function timedCount() { c=c+1; print("c=" +
我正在使用 unsigned long 来收集性能数据,同时按如下方式分析应用程序 unsigned long time_taken = (unsigned long) ((finish_time_i
我是第一次接触ApacheIoTDB,注意到时间序列时间戳的默认单位是毫秒。我想知道能不能改成纳秒或其他……我怎样才能做到这一点呢?。文件本应包括它,但我还没有找到它。
我是第一次接触ApacheIoTDB,注意到时间序列时间戳的默认单位是毫秒。我想知道能不能改成纳秒或其他……我怎样才能做到这一点呢?。文件本应包括它,但我还没有找到它。
我有一个Future,我想知道它的状态。我想到的是这样的代码: try { // Is that a good idea? Counting on exceptions looks weird
刚刚在我的 Windows (8) 工作站和 AIX 上测试了这段代码: public static void main(String[] args) { System.out
我目前正在努力处理一段非常简单的代码,它表明 ARM GCC 的 1 级优化器以某种方式破坏了一个简单的公式。 这使用标准编译器设置 (O1) 在最新的 Atmel 6.2 Studio 上运行。 A
更新:Timestamp 的构造函数的“秒的分数”参数实际上需要纳秒……我猜是百分之一秒,我的低值被四舍五入了。留题引用.... 我正在努力使用 Oracle 的 C++ 库 - OCCI。总结: 创
我们在 BigQuery 中使用带有标准 SQL 的简单选择查询。 select expiration_date FROM cards 但是,它返回以下错误, 错误:无法返回相对于 Unix 纪元的无
我在从 MySQL 5.7 表中检索 datetime(6) 字段时遇到问题。如果我直接从 mysql 客户端运行它,它可以工作: mysql> SELECT arrival from table1
我是一名优秀的程序员,十分优秀!