快速排序、求和、模拟阶乘并利用vscode c++和matlab对程序进行计时

news2025/7/9 0:18:47

一、软件性能获取

分别使用 Matlab 工具和C++语言获得计算下列算法的最大时间,最小时间及平均时间,以及相应的软件功耗:

1.1 一维数组排序

数组选择一万个,使用快速排序。处理器为英特尔i5-7200U,2.5GHz,热设计功耗为15W,Matlab版本为2021a,gcc版本为6.3.0。

1.1.1 Matlab

Quic.m

function [A,index]=quic(A,i,j)
key=A(i);
while i<j
    while i<j&&A(j)>=key
        j=j-1;
    end

    if i<j
        A(i)=A(j);
    end
   
    while i<j&&A(i)<=key
        i=i+1;
    end
    
    if i<j
        A(j)=A(i);
    end
end
A(i)=key;
index=i;
end

quicsort.m

function A=quicsort(A,low,high)
 
if low<high
    [A,key]=quic(A,low,high);
    A=quicsort(A,low,key-1);
    A=quicsort(A,key+1,high);
end

end

test.m

a = [];  %自动生成的一万个数据 
n = length(a);
t=[0,0,0,0,0,0,0,0,0,0];
for i = 1:10
    b = a
    tic
    A = quicsort(b,1,n)
    t(i) = toc
end
disp("max=")
disp(max(t))
disp("min=")
disp(min(t))
disp("mean=")
disp(mean(t))
t

t	0.0524	0.1061	0.0432	0.0459	0.0480	0.0479	0.0502	0.0501	0.0661	0.0500
max	0.1061
min	0.0432
mean	0.0560

使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.0648w、0.1591w、0.084w。

1.1.2 C++

#include<iostream>
#include <iomanip>
#include<memory.h>
using namespace std;

int *partition(int *arr,int L,int R);
void swap(int *arr,int a,int b)
{
    int tmp=arr[a];
    arr[a]=arr[b];
    arr[b]=tmp;
}
void quick_sort(int *arr,int L,int R)  //主函数中调用的函数,参数仍为	
{											 数组、左边界下标、右边界下标
    if(L<R){
        int *p=partition(arr,L,R);          //之前函数的返回值,也就是我们分													割数组三部分的边界线 
        quick_sort(arr,L,p[0]-1);           //对小于区进行快排 
        quick_sort(arr,p[0+1],R);           //对大于区进行快排 
    }
}
 
int *partition(int *arr,int L,int R)			//数组、左边界下标、右边界下标 
{       									
    int little_border=L-1;                  //小于区右边界 
    int big_boder=R;                        //大于区左边界 
    while(L<big_boder)                      //从头遍历到尾 
    {                       
        if(arr[L]<arr[R])                   //当前数比选定数小 
            swap(arr,++little_border,L++);  //放在小于区里面,小于区范围++,													进入下一个数 
        else if(arr[L]>arr[R])              //当前数比选定数大
            swap(arr,--big_boder,L);        //放在大于区里面,大于区范围++,													停在当前位置 
        else
            L++;                            //放着不动,相当于等于区,进入下													一个数 
    }
    swap(arr,big_boder,R);                   //最后把选定的数放在等于区 
    int *res=(int *)malloc(sizeof(int)*2);   //最后返回一个数组
    res[0]=little_border+1;                  //数组成员有等于区的左边界 
    res[1]=big_boder;                        //还有等于区的右边界 
    return res;                              //函数返回这个数组的指针,方便我													们进行下一次的递归快排 
}
 
int main()
{
    int arr_origin[10005] = {……}             //自动一万个数字,此处太多,就													不放了
    int len=10000;
    int arr[10005];
    double clockstart, clockend;
    int time[10] = {0};
    int Max,Min,Ave,sum;
    int times = 0;
    Max = -1;
    Min = 10000;
    Ave = 0;
    sum = 0;

    while(times != 10)										//执行十次
    {
        memcpy(arr,arr_origin, sizeof(int) * 10000);   //数组重新赋值

        clockstart = clock();
        quick_sort(arr,0,len-1);
        clockend = clock();
        time[times] = clockend - clockstart;
        times++;

    }

    //计算最大最小 平均耗时
    for(int i = 0;i < 10;i++)
    {
        int x = time[i];
        if (x > Max) 
            Max = x;
        if (x < Min) 
            Min = x;

        sum += x;
        cout<<time[i] <<" ";
    }
    Ave = sum / 10;
    cout<< "\n Max"<<Max<<"     Min:"<<Min <<"    Ave:"<<Ave<<endl;
    return 0;
}

运行了十次,可以看到最大的执行时间为5ms,最小的为2ms,平均执行时间为3ms。
t	0.004	0.003	0.004	0.002	0.003	0.003	0.002	0.003	0.005	0.002
max	0.005
min	0.002
mean	0.003

使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.003w、0.0075w、0.0045w。

1.2 实现 1+2+3+………+10000000的求和

1.2.1 Matlab

t=[0,0,0,0,0,0,0,0,0,0];
for i = 1:10
    sum = 0;
    tic
    for j = 1:10000000
        sum =  sum + j;
    end
    t(i) = toc;
    sum
end
disp("max=")
disp(max(t))
disp("min=")
disp(min(t))
disp("mean=")
disp(mean(t))
t

t	0.021	0.015	0.014	0.017	0.014	0.014	0.014	0.015	0.015	0.019
max	0.021
min	0.014
mean	0.016

使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.021w、0.0315w、0.024w。

1.2.2 C++

#include<iostream>
#include<time.h>
using namespace std;
long long int add(long int input)
{   
    long long int sum = 0;
    for(int i = 1; i <= input; i++)
        sum += i;
    
    return sum;
}
int main()
{
    int n = 10000000;
    long long int result = 0;
    double clockstart, clockend;

    clockstart = clock();
    result = add(n);
    clockend = clock();

    cout<<clockend - clockstart<<endl;
    cout<<result;
    
    return 0;
}

t	0.023	0.024	0.023	0.022	0.024	0.021	0.023	0.024	0.022	0.023
max	0.024
min	0.021
mean	0.022

使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.0315w、0.036w、0.033w。

1.3 实现1000的阶乘

使用数组模拟,数组的每一位代表结果的每一位。数组的长度为结果的长度。

#include <iostream>
#include<time.h>
using namespace std;
int main()
{
    int k=1;                        //k为当前的位数
    int fact[10000]={1,0};
    int n=1000;
    double clockstart, clockend;

    clockstart = clock();

    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < k; j++)
        {
            fact[j] = i * fact[j];               //各位乘
        }
        for(int j = 0; j < k; j++)
            {
                if(fact[j] >= 10)  
                {

                        fact[j+1] += fact[j] / 10;
                        fact[j] = fact[j] % 10;
                }
            }
        while(fact[k]>=10)               //先看大于等于10的
        {
            fact[k+1] += fact[k] / 10;
            fact[k] = fact[k] %10;
            k++;
        }
        if(fact[k] > 0)                 //只剩下大于0小于10的,这最高一位了
        {
            k++;                      //结束之后,k比最高位下标多了 1
        }
    }
    clockend = clock();

    cout<<clockend - clockstart<<endl;
    for(int j=k-1; j>=0;j--)
    {
        cout<<fact[j];
    }
  
    return 0;
}

阶乘计算部分耗时12ms,计算结果如下,共有2568位。
在这里插入图片描述

二、通信时延

设通信总量N为10000字节,总线宽度W为32位,一次传输一个字节需要8位,每次总线时长即访问周期TB为20ns,计算完成这个通信量传输所需要的时延。若通信总量N为9981字节,其他相同,问完成这个通信量传输需要多长时间?

解:
32位=4字节, 向上取整
T1 = 10000/420 = 50000ns
T2 = 9981/4
20 = 49920ns

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

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

相关文章

智慧水务解决方案-最新全套文件

智慧水务解决方案-最新全套文件一、建设背景1、安全水务&#xff0c;监管提效2、清洁水务&#xff0c;防污治污3、节能水务&#xff0c;降本增效4、民生水务&#xff0c;体验先行二、建设思路三、建设方案四、获取 - 智慧水务全套最新解决方案合集一、建设背景 建设智慧水务的…

Dubbo入门使用

Dubbo入门案例Dubbo的特性dubbo支持的注册中心Dubbo入门案例Dubbo的特性 服务治理框架服务的监控服务的注册发现服务的通信服务的容错服务的负载均衡 dubbo支持的注册中心 nacosconsolezookeeperrediseurekaetcd …… Dubbo入门案例 通过两个demo来演示如何使用dubbo进行R…

【Java基础】Java基础题

1. 重载和重写的区别 1&#xff09;重载&#xff1a; 发生在同一个类中&#xff0c;要求方法名相同、参数类型不同&#xff08;个数不同、顺序不同、类型不同&#xff09; 和方法的返回值和访问修饰符没关系&#xff08;在只有返回值和访问修饰符不同的这种情况下&#xff0c…

Linux--进程控制

目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork的常规用法 fork调用失败的原因 进程终止 进程退出场景 退出方法 ①调用_exit函数 ②调用exit函数 ③main函数return ④异常退出 进程等待 进程等待的必要性 进程等待的方法 ①wait方法 ②waitpid方…

常用的路径规划算法浅析

路径规划 所谓路径规划&#xff0c;也就是在起点和终点之间找到一条连续的运动轨迹&#xff0c;在尽可能优化路径的同时避开环境中的障碍物。 常用的路径规划算法有传统的基于图搜索算法、基于采样的路径规划算法&#xff0c;以及考虑动力学的路径规划算法等。那么&#xff0…

位于kernel的文件系统大管家--Virtual File System

一、全局视角&#xff1a;VFS 的任务 VFS 作为中间适配层&#xff0c;他需要招呼 3 个大佬&#xff1a;1. 应用进程 &#xff0c;2.系统内核 3.底层磁盘。 二、VFS负责处理 3 个任务的核心接口 1. VFS 提供给 【应用进程 】的接口: 进程的 “办公地点” – struct fs_struc…

【C】—文件版本通讯录的实现

关于C语言的知识放在专栏&#xff1a;C 小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努力&#xff01; 目录思路代码实现完整代码&#xff08;可自取&#xff09;思路 …

【SQL】索引的创建与设计原则

【SQL】索引的创建与设计原则索引的声明与使用索引的创建删除索引索引设计原则数据准备&#xff1a;哪些情况适合创建索引不适合创建索引的情况索引的声明与使用 索引的创建 # 索引的创建 #法1:create table # 隐式方式创建索引.在声明有主键约束、唯一性约束、外键约束的字段…

java项目-第146期ssm人事工资管理系统(spring+springmvc+mybatis+jsp)_java毕业设计_计算机毕业设计

java项目-第146期ssm人事工资管理系统(springspringmvcmybatisjsp)_java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm人事工资管理系统》 该项目分为2个角色&#xff0c;管理员和用户。 用户可以浏览前台,包含功能有&#xff1a; 个人中心、公告信…

gin binding方法汇总

为了能够更方便的获取请求相关参数&#xff0c;提高开发效率&#xff0c;gin框架提供了Bind系列方法。 分类 Bind系列方法大致分两类&#xff1a; Should类型Must类型 二者的区别就是&#xff1a;should和must的区别&#xff0c;即must绑定失败会报错 关系图 Should类型 …

【licheePi-dock】驱动一个OLED-SSD1306

【licheePi-dock】驱动一个OLED-SSD1306OLED驱动修改设备树向内核添加驱动1.找到一个合适的位置&#xff0c;创建oled驱动文件&#xff1a;修改当前目录下的Kconfig和Makefile把驱动添加进内核编译编写应用程序编译我使用的是cmakeOLED驱动 本文使用的是i2c驱动的OLED【Lichee…

【PowerQuery】在Excel中手动刷新数据连接

将数据通过PowerQuery 导入进来后,这里将进行数据分组运算,最终的数据计算结果将保存在Excel 表格中,图1为数据导入结果。 图1 使用PowerQuery 加载导入的数据 在Excel中,如果我们希望进行销售统计的手动更新可以使用几种不同的方法来进行刷新这些数据。 1.刷新单一数据连…

UJNOJ_1000-1007_python

1000: AB Problem 内存限制&#xff1a;128 MB时间限制&#xff1a;10 S 评测方式&#xff1a;文本比较命题人&#xff1a;jiangyan 提交&#xff1a;109解决&#xff1a;87 提交提交记录统计 题目描述 Calculate ab result 输入 Two integer a,b (0<a,b<10) …

青少年python系列 46.文件操作2

青少年python教学视频ppt源码 青少年ptyhon可以参加的主流比赛大全_老程序员115的博客-CSDN博客 在上节课我们学习了如何查询文本信息内容&#xff0c;那我们能否使用Python来往文本中保存数据信息呢&#xff1f;当然也是可以的。Python可以完成将数据信息写入文件&#xff0c…

【机器学习】主成分分析

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 维数灾难 在高维情形下出现的数样本稀疏、距离计算困难等问题&#xff0c;是所有机器学习方法共同面临的的严重障碍&#xff0c;被称为“维数灾难”或“维数危机”&#xff08;curse of dimensionality…

MongoDB的安装配置及使用(WIndows/Java)

Hi&#xff0c;I‘m Shendi 下面主要介绍使用 Windows安装 MongoDB 和使用 Java 操作 文章目录MongoDB下载创建数据目录运行配置安装服务创建用户用户角色列表Java使用查询数据插入数据修改数据删除数据设置数据过期时间其他问题MongoClient是否需要关闭&#xff1f;内存为什么…

2022.11组队学习——跨模态视频搜索VCED

文章目录一、环境配置&#xff08;1.2章节可跳过&#xff09;1.1 docker启动本项目1.1.1 win10下安装docker1.1.2 配置容器1.1.3 启动项目1.2 使用vmware下的liunx启动本项目1.2.1 升级python3.91.2.2 安装其他包1.3 使用WSL下的linux启动本项目1.3.1 安装WSL1.3. 2安装Ubuntu1…

预测市场赛道新机遇:Moonquiz生态基于FIFA WORLD CUP推出首个预测应用

对未来事件的预测始终有着较为重要的意义&#xff0c;无论是对天气、地质灾害等的预测&#xff0c;还是对金融市场、事件走势等的预测&#xff0c;都有望让个人和组织对潜在的风险进行对冲&#xff0c;并获得最大化收益。 从Web3领域看&#xff0c;预测市场是活跃于加密行业早期…

M1 在VMware里安装Centos8

本文档主要介绍Mac M1芯片如何通过Vmware虚拟机&#xff0c;安装Centos系统。 安装准备 安装之前需要下载虚拟机安装包和Centos8镜像。 百度云自取链接: https://pan.baidu.com/s/19bPaU5Vf8HG6sv3C_jZDXw 提取码: 6jen 链接内容如下&#xff0c;centos8镜像&#xff0c;vm…

Linux零拷贝解析

目录 先备知识 物理内存 虚拟内存 内核空间和用户空间 内核空间 用户空间 DMA传输 上下文切换 传统IO执行流程 零拷贝实现的几种方式 用户态直接I/O mmapwrite实现的零拷贝 sendfile实现的零拷贝&#xff08;用户不可见&#xff09; sendfileDMA scatter/gather实…