分别使用 Matlab 工具和C++语言获得计算下列算法的最大时间,最小时间及平均时间,以及相应的软件功耗:
数组选择一万个,使用快速排序。处理器为英特尔i5-7200U,2.5GHz,热设计功耗为15W,Matlab版本为2021a,gcc版本为6.3.0。
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
使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.0648w、0.1591w、0.084w。
#include
#include
#include
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。
使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.003w、0.0075w、0.0045w。
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
使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.021w、0.0315w、0.024w。
#include
#include
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;
}
使用的微处理器为 Intel®i5-7200U@2.5GHZ,其热设计功耗为 15w,其 10% 为 1.5w。这样这个程序最小、最大、平均能耗分别为:0.0315w、0.036w、0.033w。
使用数组模拟,数组的每一位代表结果的每一位。数组的长度为结果的长度。
#include
#include
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/420 = 49920ns