Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 性能分析器:如何使用unsignedlong以微秒为单位测量时间?_C++_C - Fatal编程技术网

C++ 性能分析器:如何使用unsignedlong以微秒为单位测量时间?

C++ 性能分析器:如何使用unsignedlong以微秒为单位测量时间?,c++,c,C++,C,我使用unsigned long收集性能数据,同时分析应用程序,如下所示 unsigned long time_take=(unsigned long)((完成时间以秒计-开始时间以秒计)/1000) 写入文件所用的时间。对我的应用程序中调用的每个函数都执行此操作 现在,在应用程序执行之后,让一个单独的程序读取上述文件,并总结每个函数所花费的时间,包括调用计数,例如 func\u name aggregate\u time call\u counts 我遇到的问题是,对于某些函数,aggrega

我使用unsigned long收集性能数据,同时分析应用程序,如下所示

  • unsigned long time_take=(unsigned long)((完成时间以秒计-开始时间以秒计)/1000)

  • 写入文件所用的时间。对我的应用程序中调用的每个函数都执行此操作

  • 现在,在应用程序执行之后,让一个单独的程序读取上述文件,并总结每个函数所花费的时间,包括调用计数,例如

  • func\u name aggregate\u time call\u counts

    我遇到的问题是,对于某些函数,aggregate_time字段是一个20位的值,即无符号long可以容纳的最大值。这不可能是真的,因为我以微秒为单位测量时间,并且运行我的应用程序的时间不会超过20秒。那么它怎么可能是一个20位数的值呢

    您是否看到步骤1、2和3中的错误

    问候,, 克里希纳

    编辑:

    1) 时间测量: 时钟获取时间(时钟实时和开始时间); 时钟获取时间(时钟实时和完成时间); 无符号长时间=无符号长时间((finish\u time.tv\u nsec-art\u time.tv\u nsec)/1000)

    2) 文件写入: fwrite(花费的时间和长度,sizeof(无符号长),1,数据文件)

    3) 文件读取:
    fread(所花费的时间和长度,sizeof(long),1,数据文件)

    问题不在您显示的代码中-尽管以纳秒为单位了解时间类型会很有趣

    因此,问题在于您没有显示的代码:

    • 将数据写入文件
    • 从文件中读取数据
    • 以纳秒为单位获取时间
    • 以微秒为单位处理时间

    实际上,在某些情况下可能会获得负时间。考虑到时间间隔非常小,它们很可能来自使用RDTSC指令,该指令读取一个计数器,该计数器随CPU的每个时钟递增。在一些多核AMD处理器上,每个内核都有自己的计数器,不与其他内核同步,因此在不同内核上执行的两个连续读数之间的差值可能为负值

    通过强制程序在单个内核上执行,例如使用Win32 API
    SetProcessAffinityMask
    ,可以很容易地解决这个问题

    编辑:小心你如何测量时间。大多数时候API的分辨率都很糟糕,所以使用它们测量小的间隔是没有意义的。尝试显式使用RDTSC


    最重要的是:文件I/O是一个非常慢的函数,它可以完全破坏有用的信息。例如,如果同时对调用者和被调用者执行测量,并且被调用者将结果写入文件,则为调用者测量的时间将包括在
    fwrite
    中花费的时间。还要监视每次写入,以便您可以看到在那里花费了多少时间(为了避免递归,您可以保存一次写入所花费的时间,并将其记录到下一次写入中)。

    问题在于您的时间度量代码:

    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\u time
    finish\u 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

    是否有一个工具可以为您这样做?也许你的完成时间和开始时间颠倒了。有什么原因你不能使用,例如,
    gprof
    (它就是这样做的)或valgrind/callgrind(它是一个更好的分析工具)?嗨,谢谢。对由于某种原因,我无法使用它们。甚至还有针式探针,但我是根据第一原理来做的。1)时间测量:时钟获取时间(时钟实时和开始时间);时钟获取时间(时钟实时和完成时间);无符号长时间=无符号长时间((finish\u time.tv\u nsec-start\u time.tv\u nsec)/1000);2)文件写入:fwrite(&time_take,sizeof(unsigned long),1,datafile);3) 文件读取:fread(&time_take,sizeof(long),1,数据文件);您好,很抱歉上面的内容没有缩进就乱七八糟了。。。。我不知道如何在提供的文本框中添加格式…如果同时使用gettimeofday()函数,我也会遇到同样的问题。此外,我不是在测量函数之间的时间,我的开始和结束时间是每个函数的开始和结束时间。。。因此,我猜开始时间在一个CPU上执行,而完成时间在另一个CPU上执行的可能性较小或不存在。@Kris:您必须在
    main()
    中添加一个API调用来检查它。我无法控制main。。。我的东西就像一个共享对象,它“劫持”了我的可执行文件发出的OpenGL API调用(我只按原样运行它…甚至不能重新编译…只需使用LD_PRELOAD将可执行文件链接到我的共享对象并运行!!)你可以使用process explorer更改关联性。嗨,Ruslik,我找到了你的“小心你如何测量时间。大多数时候API的分辨率都很糟糕,所以使用它们测量小的间隔是没有意义的。尝试明确地使用RDTSC。“对我也怀疑的事情发表评论。。。但我不知道是否有出路。。。而RDTSC本身也有很多问题。。。对于真正的问题是什么有点不知所措。。。是否使用错误的API来测量时间,是否在写入/读取文件时出错???Oops。。。精彩的观察!!谢谢这个。。。真不好意思我错过了这个。。。这个答案你想要多少票?:-)但是为什么你只把电视秒的值乘以1000呢?应该是1000000吧?@Kris Retro Virus:你应该选择这个作为答案(这样做甚至会给你几分)。哦,好的。我以为是电视