Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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/6/cplusplus/157.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++;和爪哇 我试图比较时序方法与C++和java的精度。 < C++ >我通常使用 CcLoSsSpRIXSEC/,我运行代码块,我希望时间一定的时间,然后计算它花费了多长时间,基于块执行了多少次。_Java_C++_Time_Timing - Fatal编程技术网

用C++;和爪哇 我试图比较时序方法与C++和java的精度。 < C++ >我通常使用 CcLoSsSpRIXSEC/,我运行代码块,我希望时间一定的时间,然后计算它花费了多长时间,基于块执行了多少次。

用C++;和爪哇 我试图比较时序方法与C++和java的精度。 < C++ >我通常使用 CcLoSsSpRIXSEC/,我运行代码块,我希望时间一定的时间,然后计算它花费了多长时间,基于块执行了多少次。,java,c++,time,timing,Java,C++,Time,Timing,对于Java,我通常使用System.nanoTime() 哪一个更准确,我用C++还是我用java?在C++中还有其他的时间方法,所以我不需要重复代码来获得正确的测量结果吗?基本上,有C++的系统吗? 我知道两者都使用系统调用,这会导致相当大的延迟。这是如何扭曲时间的真正价值的?有什么方法可以防止这种情况发生吗?使用System.nanoTime()时要小心,因为它仍然受到您运行的机器所能提供的分辨率的限制 另外还有一些复杂的问题,Java在开始使用函数的时候会慢很多,直到它们针对您的系统进行

对于Java,我通常使用
System.nanoTime()

<>哪一个更准确,我用C++还是我用java?在C++中还有其他的时间方法,所以我不需要重复代码来获得正确的测量结果吗?基本上,有C++的<代码>系统吗?
我知道两者都使用系统调用,这会导致相当大的延迟。这是如何扭曲时间的真正价值的?有什么方法可以防止这种情况发生吗?

使用System.nanoTime()时要小心,因为它仍然受到您运行的机器所能提供的分辨率的限制

另外还有一些复杂的问题,Java在开始使用函数的时候会慢很多,直到它们针对您的系统进行了优化

事实上,所有现代系统都使用先发制人的多线程和多核等,所以所有的计时都会因运行而异。(例如,如果控件在方法中时从线程切换开)

要获得可靠的计时,您需要

  • 在启动之前,围绕正在计时的对象运行数百次,以预热系统
  • 多次运行代码并平均结果

  • 可靠性问题对于任何语言都是一样的,所以C语言和Java语言一样适用,所以C语言可能不需要预热循环,但您仍然需要采集大量样本并对其进行平均。

    每个方法都有错误。在你花大量时间回答这个问题之前,你必须问自己“我需要我的答案有多准确?”?通常,解决方案是多次运行一个循环/一段代码,并跟踪测量的平均值/标准偏差。这是一个处理测量重复性的好方法。在此之后,假设“开始时间”和“停止时间”调用之间的延迟是“可比较的”(无论您使用了什么函数),并且您有一个框架来理解这些问题

    底线:
    clock()
    函数通常提供微秒精度

    有关如何在C中实现这一点的示例,请参见(在该示例中,使用usec精度时钟)。有使用ns计时的能力-例如,请参见使用
    clock\u gettime(clock\u MONOTONIC\u RAW,&tSpec)的答案


    请注意,您必须从该结构中分别提取秒和纳秒。

    在流程中循环时,您是否能够通过跟踪标准偏差来确定方法的准确性?您的进程可能不是系统上运行的唯一进程,调度器应该可以随时为其提供时间。我说过,标准偏差将为您提供可重复性的处理方法:如果您多次这样做,您是否会得到相同的答案(几乎与“精度”相同)。这与准确性不同:这是正确的答案吗。如果没有校准,您无法知道这一点。很抱歉对命名法有点挑剔。@bruce14-需要注意的另一点-提供的大多数时钟(除了“挂钟”时钟)测量进程中经过的时间,以便补偿进程暂停的时间。
    getrusage()
    在这方面特别强大。我同意你的观点,但OP要求准确性,所以我质疑它。但你的第二个评论完全正确,所以我的问题与此无关。ThanksA显示“预热”效果的一个很好的方法是记录每个循环后经过的(总)时间,然后绘制这些值与循环计数的关系图(当涉及网络连接时,尤其明显,但即使内存缓存也可以播放)。该曲线的斜率在最初的几次迭代中可能会增加,然后趋于稳定。我相信,这正是您所描述的效果。即使在C语言中,缓存等也可能会产生一些“预热”效果。在Java中,由于即时编译,这种效果更为明显。最初的几次运行字节码,然后逐渐地越来越多的代码被转换为适合其运行环境的汇编程序。根据标准,从
    clock()
    开始的时间应该是您的应用程序使用的CPU时间,因此先退出再重新加入不会影响它。(在这方面,
    clock()
    的Windows实现被破坏。)当然,被另一个进程中断,然后继续,可能会影响缓存中的进程内存量,这反过来会影响性能。但在应用程序中切换到另一个线程将不会被检测到…并且您依赖于该行为的一致性和可靠性。。。