001_measuretime_in_Matlab运行时间测量与时间复杂度分析

news2024/12/30 3:48:01

Matlab中测量时间

在使用Matalb时,经常需要考虑自己编写代码的效率。在这种情况下,我们需要测量程序运行的时间。Matlab提供了一些函数来测量程序运行的时间。

1. 函数简介

本文涵盖的函数包括:

  1. tic和toc函数
  2. cputime函数
  3. timeit函数

1.1 tic和toc函数

在Matlab中,我们可以使用tic和toc函数来测量程序运行的时间。tic函数用于开始计时,toc函数用于结束计时并返回时间。

tic
% your code
toc

1.2 cputime函数

cputime函数返回当前进程的CPU时间。CPU时间是指程序在CPU上运行的时间,不包括程序等待I/O的时间。

t = cputime;
% your code
t = cputime - t;

1.3 timeit函数

timeit函数用于测量函数的运行时间。timeit函数会多次运行函数,并返回中位数(median)运行时间来作为最终的评价值。

t = timeit(@() your_function());

1.4 注意事项

这里还需要注意的是,timeit函数与tic/toc函数的运行会相互干扰。因此,不要在同一个函数中同时使用这两种方法。

  • 不能在tic和toc之间调用timeit函数。
  • 不能用timeit来测试包含tic和toc的函数。
  • timeit不能递归调用。

2. 高端使用场景

下面用几个例子来对这几个函数主要是timeit的用法进行说明。

2.1 O(·)时间复杂度的概念

通常我们分析算法的复杂度,会引入O(·)时间复杂度的概念。O(·)时间复杂度是指算法运行时间与输入规模的关系。例如,一个算法的时间复杂度为O(n),表示算法的运行时间与输入规模n成正比。一个算法的复杂度为O(1),表示算法的运行时间与输入规模无关。一个算法的复杂度为O(n^2),表示算法的运行时间与输入规模n的平方成正比。诸如此类,我们可以通过O(·)时间复杂度来表示算法的效率。

那么对我们自己开发的算法,如何测量其时间复杂度呢?这里我们可以使用timeit函数来测量算法的运行时间。

2.2 测量算法的运行时间

下面我们通过一个例子来说明如何使用timeit函数来测量算法的运行时间,并绘制算法的运行时间与输入规模的关系。

function t = my_algorithm(n)
    % your algorithm
end

上面是我们开发的算法的调用方式。下面我们使用timeit函数来测量算法的运行时间。

n = 1:1000:10000;
t = zeros(size(n));
for i = 1:length(n)
    t(i) = timeit(@() my_algorithm(n(i)));
end
plot(n, t);
xlabel('Input size');
ylabel('Running time');

这个部分写得有点啰嗦,实际上我最近学习了arrayfun之后感觉自己整个人都已经array了,上面的程序可以改得更简单。

n = 1:1000:10000;
t = arrayfun(@(x) timeit(@() my_algorithm(x)), n);
plot(n, t);
xlabel('Input size');
ylabel('Running time');

绘制曲线之后,还可以通过拟合曲线来得到算法的时间复杂度的估计。

例如,我们测试的算法如果是rand(n) * rand(n),结果可以看到是近似O(n^3)的时间复杂度。这算法的时间复杂度我们可以通过理论分析得到。这里相当是采用实验的方法来验证我们的理论分析。

在这里插入图片描述

2.3 偶然的发现:Matlab的多线程加速

事情在测试sum((x^2/(x^2+1)).^linspace(0.1, 2.0, x)) / x的时候,突然有一个很好玩的现象,这里的代码是一个数学公式的计算。

1 x ∑ i = 1 x ( x 2 x 2 + 1 ) i \frac{1}{x} \sum_{i=1}^{x} \left( \frac{x^2}{x^2+1} \right)^{i} x1i=1x(x2+1x2)i

这里,实际上主体的计算是一个.^,也就是元素乘方(Element-wise power)。

ns=10:500;
times=arrayfun(@(x)timeit(@() sum((x^2/(x^2+1)).^linspace(1, 2.0, x)) / x), ns);
plot(ns, times);

当我们测试 n ∈ [ 10 , 500 ] n\in[10, 500] n[10,500] 时,一切都很正常,这个算法可以明显看到是O(n)的时间复杂度。

在这里插入图片描述

但是,当我们把范围扩大到 n ∈ [ 10 , 1000 ] n\in[10, 1000] n[10,1000] 时,突然发现了一个很有趣的现象。

ns=10:1000;
times=arrayfun(@(x)timeit(@() sum((x^2/(x^2+1)).^linspace(1, 2.0, x)) / x), ns);
plot(ns, times);

在这里插入图片描述

而且,这个现象非常稳定,n始终出现在511的位置。这个现象是什么呢?经过拍脑袋、看文档,我目前猜测这个现象是Matlab的多线程加速。

在这里插入图片描述

对此,Matlab的文档中有这样的描述:

Implicit Parallelization with Built-in Multithreading

Some MATLAB functions implicitly use multithreading to parallelize their execution. These functions automatically execute on multiple computational threads in a single MATLAB session, which means they run faster on multicore-enabled machines. Some examples are linear algebra and numerical functions such as fft, mldivide, eig, svd, and sort. Therefore, if you use these functions on a machine with many cores, you can observe an increase in performance.

内置多线程的隐式并行化

一些MATLAB函数隐式地使用多线程来并行化它们的执行。这些函数在单个MATLAB会话中自动在多个计算线程上执行,这意味着它们在多核启用的机器上运行得更快。一些例子是线性代数和数值函数,如fft、mldivide、eig、svd和sort。因此,如果您在多核机器上使用这些函数,您可以观察到性能的提高。

只是对于矩阵乘法,N=10000还没有表现出多线程加速。

在这里插入图片描述

这个有意思的问题下次再继续研究。

3. 总结

本文介绍了Matlab中测量程序运行时间的几种方法。这些方法包括tic和toc函数、cputime函数、timeit函数。这些函数可以用于测量程序运行的时间,用于评估算法的效率。

  1. tic和toc函数用于测量程序片段的运行时间。

  2. timeit函数用于测量函数的运行时间。

  3. timeit可以很方便的进行时间复杂度的分析。
    b中测量程序运行时间的几种方法。这些方法包括tic和toc函数、cputime函数、timeit函数。这些函数可以用于测量程序运行的时间,用于评估算法的效率。

  4. tic和toc函数用于测量程序片段的运行时间。

  5. timeit函数用于测量函数的运行时间。

  6. timeit可以很方便的进行时间复杂度的分析。

  7. Matlab的隐式多线程加速可能在某些情况下是一个需要考虑的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信投票小程序源码系统:礼物道具投票盈利能力超强 带完整的安装代码包以及安装部署教程

近年来,微信小程序以其便捷性、轻量化等特点,迅速占据了移动应用市场的一席之地。投票小程序作为其中的一种应用类型,因其独特的互动性和社交性,成为了商家进行品牌宣传、活动推广的有力工具。然而,市场上的投票小程序…

【数据可视化】Echarts官方文档及常用组件

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. Echarts官方文档介绍3. ECharts基础架构及常用术语3.1 ECharts的基础架构3.2 ECharts的常用术语3.2.1 ECharts的基本名词3.2.2 ECharts的图表名词 4. 直角坐标系下的网格及坐标轴4.1 直角坐标系下的网格4.2…

训练svm并部署树莓派

训练svm并部署树莓派 开发环境1. 准备数据集2. 训练模型3. 部署模型开发环境 vscode python 3.8 用到的库: scikit-learn==1.3.2 pickle torch pandas matplotlib 1. 准备数据集 数据为xls文件,如下格式 2. 训练模型 文件结构 执行训练 python代码 import pickle &…

基于Spring Boot的研究生志愿填报辅助系统

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

代码随想录day28(1)二叉树:二叉搜索树中的插入操作(leetcode701)

题目要求:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。 思路:对于二叉搜索树来说&…

win10 chm文件打开空白怎么办 win10 chm文件打开空白解决办法

win10 chm文件打开空白怎么办 win10 chm文件打开空白解决办法 有的win10用户遇到chm文件在本地打开是正常的,但是一旦共享就会出现打开空白的情况,像这种情况怎么办呢?其实会出现这种情况基本是因为win10系统的安全防护功能,它…

verilog设计-CDC:单bit脉冲快时钟域到慢时钟域

一、前言 当单bit信号由快时钟域传递给慢时钟域时,快时钟域的异步信号最小可为快时钟信号的一个时钟周期脉冲,快时钟域的单时钟周期脉冲长度小于慢时钟域的时钟周期,很有可能该脉冲信号在慢时钟域的两个时钟上升沿之间,导致该脉冲…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分,PHM首先借助传感器采集关键零部件的运行状态数据,如振动信号、温度图像、电流电压信号、声音信号及油液分析等,提取设备的运行监测指标,进而实现对设备关键零部件运行状…

C++面试宝典第36题:骑士游历

题目 在国际象棋的棋盘上,使一个骑士遍历所有的格子一遍且仅一遍。对于任意给定的顶点,输出一条符合上述要求的路径。骑士的走法和中国象棋的马的走法一样,走日。 解析 本题是一个经典的回溯搜索问题,具体来说是求解国际象棋棋盘上骑士的遍历问题,也称为骑士巡游问题(Kni…

新品发布 | Ftrans FIE文件安全导入导出系统

关于飞驰云联 飞驰云联是中国领先的数据安全传输解决方案提供商,长期专注于安全可控、性能卓越的数据传输技术和解决方案,公司产品和方案覆盖了跨网跨区域的数据安全交换、供应链数据安全传输、数据传输过程的防泄漏、FTP的增强和国产化替代、文件传输自…

SinoDB系统数据库

在SinoDB数据库的一个实例中,存在多个数据库,分为系统数据库和用户数据库。系统数据库在实例初始化时自动创建,存放实例级别上的监控信息、数据字典信息,用户能够访问而不能修改这些数据。用户数据库由用户根据需要创建&#xff0…

Ubuntu Desktop - lock screen (锁屏)

Ubuntu Desktop - lock screen [锁屏] 1. System Settings -> Security & Privacy (安全和隐私)2. System Settings -> Keyboard -> Shortcuts -> System3. LockReferences 1. System Settings -> Security & Privacy (安全和隐私) 使用 Putty 远程登录…

飞跃前端瓶颈:技术进阶指南精华篇

引言: 在互联网的快车道上,前端技术日新月异。对于前端工程师而言,技术水平达到一定高度后,往往会遭遇成长的天花板。本文将探讨如何识别并突破这些技术瓶颈,分享实用的进阶策略和实践案例。 一、技术等级概览&#xf…

WORD某一段格式调整,其他段落也调整

在编辑WORD文字格式时,有时候会出现WORD某一段格式调整,其他段落的格式直接就乱了,该如何修复? 答:问题的根源在于格式的自动更新,把自动更新前面的勾选框取消即可。

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【图解物联网】第1章 物联网的基础知识

1.1 物联网入门 1.1.1 物联网 物联网的英语是Internet of Things,缩写为IoT,这里的“物”指的是我们身边一切能与网络相连的物品。只要能与网络相连,就都是物联网说的“物”。 物联网就是“物”之间通过连接互联网来共享信息并产生…

九型人格测试适用于什么场景和群体?

九型人格起源于希腊的九和图,后来人们根据现实需求不断的进行改进,才形成了我们今天看到的九型人格测试。其理论基础源远流长,应用在生活中的各个领域,不同的群体不同的需求,都能从九型人格中获益。 九型人格理论把人格…

python 爬取杭州小区挂牌均价

下载chrome驱动 通过chrome浏览器的 设置-帮助-关于Google Chrome 查看你所使用的Chrome版本 驱动可以从这两个地方找: 【推荐】https://storage.googleapis.com/chrome-for-testing-publichttp://npm.taobao.org/mirrors/chromedriver import zipfile import os import r…

UE4 Json事件设置Asset值(Asset如果都在同一目录下)

通过Json事件来设置,比如骨骼网格体(换皮)等等

使用FlinkCDC从mysql同步数据到ES,并实现数据检索

文章目录 一、背景一、环境准备1、创建ES索引2、创建mysql数据表 二、使用FlinkCDC同步数据1、导包2、demo3、es工具类 三、测试1、先创建几条数据2、启动cdc3、查询es4、增删改几条数据进行测验 一、背景 随着公司的业务量越来越大,查询需求越来越复杂&#xff0c…