C++ 如何评估c+中的性能单元+;程序

C++ 如何评估c+中的性能单元+;程序,c++,C++,我的意思是,为了衡量某些算法的性能,我需要用一些单位来衡量。因此,基本上,如果我忽略对象的声明和定义,只考虑操作,您将如何估计每个操作在运行时消耗的时间?p> 在现代机器上,这在很大程度上取决于上下文。大多数指令将在一个时钟中执行;在某些机器上,您甚至可以在每个时钟上获得多条指令。另一方面,内存访问时间可能会有很大的不同,这取决于被访问的位置是在缓存中,还是在主内存中,或者是在操作系统必须转到磁盘才能映射内存的情况下被调出。您所说的访问时间是毫秒,其中数据好像在顶级缓存中,几乎可以是即时的。(换

我的意思是,为了衡量某些算法的性能,我需要用一些单位来衡量。因此,基本上,如果我忽略对象的声明和定义,只考虑操作,您将如何估计每个操作在运行时消耗的时间?p> 在现代机器上,这在很大程度上取决于上下文。大多数指令将在一个时钟中执行;在某些机器上,您甚至可以在每个时钟上获得多条指令。另一方面,内存访问时间可能会有很大的不同,这取决于被访问的位置是在缓存中,还是在主内存中,或者是在操作系统必须转到磁盘才能映射内存的情况下被调出。您所说的访问时间是毫秒,其中数据好像在顶级缓存中,几乎可以是即时的。(换句话说,我们谈论的是皮秒的100秒,而不是10毫秒。)这就是为什么你会听到这么多关于局部性的信息。

c++11
中,你有
std::chrono
库(请参阅)。否则,你可以使用
boost::chrono
(请参阅).这两个是非常基本的时间度量库,您可以从中开始

编辑:在c++0x中,有
clock()
函数,但正如注释部分所述,这不是一个非常精确的度量。此外,大多数平台还为与计时相关的操作提供某种API

如何衡量性能取决于上下文。首先,您需要在足够大且多样的样本数据上比较性能。足够大意味着它至少可以在几秒钟内进行测量。足够多样意味着它可以覆盖所有运行场景的重复,可以是一致的,也可以是单独的(您至少应该知道示例数据代表什么)

对于足够简单的情况,您要做的第一件事是将算法划分为所需的多个部分,让我们称它们为
A_1,…,A_N
(或者
A_1…A_N
是同一问题的不同解决方案,这个概念仍然适用)。您要做的是测量相同样本数据上每个分区花费的时间量。在伪代码中:

times <- (0,...,0) //vector of size N
for each input in sample data:
    start = now()
    //Run A_1 on input
    end = now()
    times[1] <- times[1] + (end-start)
    ...
    ...
    ...
    start = now()
    //Run A_N on input
    end = now()
    times[N] <- times[N] + (end-start)

times衡量性能的方法有很多,而“正确”的方法很大程度上取决于您实际在做什么。通常,衡量性能的简单方法就是让应用程序做它通常做的事情,然后只测量时间-如果时间足够长,只需使用秒表(例如,手机应用程序、手表功能或类似功能)将非常有效。对于较短的时间段,您可能需要其他方法-一直到使用“CPU时钟周期”和CPU本身的“TSC”-时间戳计数器

如果它只需要很短的时间,但是你的应用程序会做很多,那么多次运行相同的代码

对于其他应用程序,由于所花费的时间并不是真正使用CPU时钟周期,因此变得更加困难—例如,如果应用程序的一部分正在读取某个大文件,那么所使用的CPU时间可能只有2-3%,其余时间则花在等待硬盘从其中的实际磁盘获取数据上

如果应用程序正在使用网络,那么CPU可能只使用1GB网络链路发送数据包所需时间的百分之几

数据的类型以及数据的组织、排序和使用方式也很重要。如果您从已排序的源中插入要排序的内容,则其执行情况可能与未排序的项目列表完全不同——令人惊讶的是,它可能更好,也可能更差,具体取决于数据的存储/排序方式

“查看代码”并确定其性能可能非常困难。除了“代码外观”之外,还有很多其他因素会影响它


如果您有一个可用的现有应用程序,请测量它的性能,并使用分析软件查看在哪里花了多少时间才是一个好的计划。

所有这些答案都取决于运行算法的硬件。如果您想对算法的复杂程度进行一般性测量,则应执行大O和大ω分析


如果您对此有更多问题,请告诉我,但根据您的问题标题,您应该寻找算法作为其数据输入函数的指令数,而不是基于特定硬件测量性能。

您尝试过什么?一种简单的方法是测量完成10000次运算所需的时间0次运算,然后除以100000。然后重复几次,取平均值。要做到这一点,你需要知道如何测量100000次运算的时间,你知道怎么做吗,或者这就是你要问的吗?基本上我不知道如何测量时间。这样做有意义吗?我的意思是,这可能是不对的,因为它可能t依赖于操作?搜索“c++测量时间”(可能在查询中提及您的平台…)可能重复:@DanielaDiaz测量时间很简单(Windows下除外,在Windows下,
clock()
函数被破坏)。设计测试以便测量所需内容,而不是编译器优化的程度,或者是否得到缓存命中,或者其他方面,要困难得多。在C++03中,您已经有了
clock()
。测量时间不是问题。设计测试以便测量所需内容是。
clock()
测量CPU时间而不是实时。要测量实时,C++03只有
时间()
,通常没有亚秒分辨率。@bames53:您可以将时钟的返回结果除以时钟/秒宏以获取时间seconds@eladidan为什么人们说那个钟有一个非常低的近似精度吗?@eladian这仍然是CPU时间,而不是实时。那