MATLAB中计算函数运行时间的方法

MATLAB中计算函数运行时间的方法,第1张

MATLAB自带计算函数运行时间的函数,有如下方法:

采用tic;toc

tic;  % 开始计时

   % 你的代码放这里

toc; % 输出代码运行时间,从最近的tic开始算

采用cputime

t0=cputime;

                     %你的代码

t=cputime-t0       %程序运行时间

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。

它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。

参考资料:

百度百科—MATLAB

这个是windows里面常用来计算程序运行时间的函数;

DWORD dwStart = GetTickCount();

//这里运行你的程序代码

DWORD dwEnd = GetTickCount();

则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位

这个函数只精确到55ms,1个tick就是55ms。

2

timeGetTime()基本等于GetTickCount(),但是精度更高

DWORD dwStart = timeGetTime();

//这里运行你的程序代码

DWORD dwEnd = timeGetTime();

则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位

虽然返回的值单位应该是ms,但传说精度只有10ms。

3

用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。

clock_t clock ( void );

#include <timeh>

clock_t t = clock();

long sec = t / CLOCKS_PER_SEC;

他是记录时钟周期的,实现看来不会很精确,需要试验验证;

4

#include<iostream>

#include<ctime>

using namespace std;

int main()

{

time_t begin,end;

begin=clock();

//这里加上你的代码

end=clock();

cout<<"runtime: "<<double(end-begin)/CLOCKS_PER_SEC<<endl;

}

5

unix时间相关,也是标准库的

这些在<timeh>

1timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;

time_t timegm(struct tm tm);

2mktime使用时区信息

time_t mktime(struct tm tm);

timelocal 函数是GNU扩展的与posix函数mktime相当

time_t timelocal (struct tm tm);

3gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;

struct tm gmtime(const time_t clock);

4localtime使用时区信息

struct tm localtime(const time_t clock);

1time获取时间,stime设置时间

time_t t;

t = time(&t);

2stime其参数应该是GMT时间,根据本地时区设置为本地时间;

int stime(time_t tp)

3UTC=true 表示采用夏时制;

4文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;

5设置时区推荐使用setup来设置;

6设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效

time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t

看看你的系统是否有time_t64,它能表示更大的时间范围

Window里面的一些不一样的

CTime MFC类,好像就是把timeh封了个类,没扩展

CTime t = GetCurrentTime();

SYSTEMTIME 结构包含毫秒信息

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, PSYSTEMTIME;

SYSTEMTIME t1;

GetSystemTime(&t1)

CTime curTime(t1);

WORD ms = t1wMilliseconds;

SYSTEMTIME sysTm;

::GetLocalTime(&sysTm);

在timeh中的_strtime() //只能在windows中用

char t[11];

_strtime(t);

puts(t);

6

下面是转的一个用汇编的精确计时方法

---------------------------------------------------------------------------------------

如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。

在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。

我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值

下面看看实现的代码:

//用汇编实现获取一段代码运行的时间

#include<iostream>

using namespace std;

void GetClockNumber (long high, long low);

void GetRunTime();

int main()

{

long HighStart,LowStart,HighEnd,LowEnd;

long numhigh,numlow;

//获取代码运行开始时cpu内部计数器的值

__asm

{

RDTSC

mov HighStart, edx

mov LowStart, eax

}

for(int i= 0; i<100000; i++ )

{

for(int i= 0; i<100000; i++ )

{

}

}

//获取代码结束时cpu内部计数器的值,并减去初值

__asm

{

RDTSC

mov HighEnd, edx

Mov LowEnd, eax

;获取两次计数器值得差

sub eax, LowStart

cmp eax, 0 ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大

jg L1

neg eax

jmp L2

L1: mov numlow, eax

L2: sbb edx, HighStart

mov numhigh, edx

}

//把两个计数器值之差放在一个64位的整形变量中

//先把高32位左移32位放在64的整形变量中,然后再加上低32位

__int64 timer =(numhigh<<32) + numlow;

//输出代码段运行的时钟周期数

//以频率11Gcpu为例,如果换计算机把其中的11改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^

cout<< (double) (timer /11/1000000000) << endl;

return 0;

}

这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,

因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在11G的机子上是3e-8s),这样会更精确一点。

如果你要确切知道程序的运行时间,专业的测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。

不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了

网上找的,对你应该有帮助。。。

因为监控系统调整需要,需要从宿主机获取容器的 CPU 使用率。

以前在给容器分配 CPU 资源的时候,是绑定指定 CPU 的方式,那宿主只要计算不同容器绑定的 CPU 使用率即可。但是最近对 CPU 资源的分配方式进行了调整,通过 CPU使用时间 的方式对 CPU 使用率进行限制。(通过 CPU使用时间 限制有不少优势,另外写文章介绍。)

原来的方法不再适用。既然 Cgroup 可以通过 CPU 时间对 CPU 资源进行限制,那必然在某个地方会统计 CPU 的使用时间。于是我在网络上搜索了一番,大部分的结果都是告诉我可以通过以下命令获取容器的 CPU 使用率。

显然,现在一旦说到容器,基本上都会认为说的是 docker,其实我用的是LXC。不过不管怎样,计算方法应该是一致的。

摸索一番,发现在以下路径就能找到一个容器(这里是LXC)的 CPU 使用时间,时间单位是纳秒:

利用这个时间,再计算实际经过的时间,就能得出在一段时间内,CPU的使用率。

PS 通过这个方法,不仅能计算整个 CPU 使用率,还可以计算出用户态和内核态分别使用的情况,在特定情况会更有助于了解应用程序的使用情况。(见 cpuacctusage_sys 和 cpuacctusage_user )

CPU使用时间就是上一节文中提到的cgroup文件下的 cpuacctusage 文件里的时间。

当前时间,以纳秒计算,可以通过以下函数获取:

只要两个时间点的当前时间相减,就可以得到总共经过的时间了。

这个程序的源码也可以贴出来,有需要的朋友也可以去Github上可克隆:

>

1 使用装饰器来衡量函数执行时间

有一个简单方法,那就是定义一个装饰器来测量函数的执行时间,并输出结果:

import time

from functoolsimport wraps

import random

def fn_timer(function):

  @wraps(function)

  def function_timer(args, kwargs):

      t0= timetime()

      result= function(args, kwargs)

      t1= timetime()

      print("Total time running %s: %s seconds" %

          (function__name__, str(t1- t0))

)

      return result

return function_timer

@fn_timer

def random_sort(n):

  return sorted([randomrandom() for i in range(n)])

if __name__== "__main__":

  random_sort(2000000)

输出:Total time running random_sort: 06598007678985596 seconds

使用方式的话,就是在要监控的函数定义上面加上 @fn_timer 就行了

或者

# 可监控程序运行时间

import time

import random

def clock(func):

    def wrapper(args, kwargs):

        start_time= timetime()

        result= func(args, kwargs)

        end_time= timetime()

        print("共耗时: %s秒" % round(end_time- start_time, 5))

        return result

return wrapper

@clock

def random_sort(n):

  return sorted([randomrandom() for i in range(n)])

if __name__== "__main__":

  random_sort(2000000)

输出结果:共耗时: 065634秒

2 使用timeit模块

另一种方法是使用timeit模块,用来计算平均时间消耗。

执行下面的脚本可以运行该模块。

这里的timing_functions是Python脚本文件名称。

在输出的末尾,可以看到以下结果:4 loops, best of 5: 208 sec per loop

这表示测试了4次,平均每次测试重复5次,最好的测试结果是208秒。

如果不指定测试或重复次数,默认值为10次测试,每次重复5次。

3 使用Unix系统中的time命令

然而,装饰器和timeit都是基于Python的。在外部环境测试Python时,unix time实用工具就非常有用。

运行time实用工具:

输出结果为:

Total time running random_sort: 13931210041 seconds

real 149

user 140

sys 008

第一行来自预定义的装饰器,其他三行为:

    real表示的是执行脚本的总时间

    user表示的是执行脚本消耗的CPU时间。

    sys表示的是执行内核函数消耗的时间。

注意:根据维基百科的定义,内核是一个计算机程序,用来管理软件的输入输出,并将其翻译成CPU和其他计算机中的电子设备能够执行的数据处理指令。

因此,Real执行时间和User+Sys执行时间的差就是消耗在输入/输出和系统执行其他任务时消耗的时间。

4 使用cProfile模块

5 使用line_profiler模块

6 使用memory_profiler模块

7 使用guppy包

以上就是关于MATLAB中计算函数运行时间的方法全部的内容,包括:MATLAB中计算函数运行时间的方法、vc ++获取程序执行时间时间、如何计算容器的CPU使用值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9476513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存