CSU-Benjamin 2018-12-22 01:11 采纳率: 33.3%
浏览 393

代码类似耗时却是10倍,寻求大佬帮菜鸡找原因?!

耗时长约:1500毫秒:

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n;
int a[200000];
int sum;
int c=0;
void suan(int b){
    while(b<c)
    {b*=2;
    sum++;
    }
}
int main()
{
while(scanf("%d",&n),n){
for(int i=0;i<n;i++){
    scanf("%d",&a[i]);
    if(c<a[i])c=a[i];
}
    sum=0;
    for(int i=0;i<n-1;i++){
           suan(a[i]);
        }

    printf("%d\n",sum+c);
}
return 0;
}

耗时短:80毫秒。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
const int maxn=200005;
int n,m;
int a[maxn];
int fun(int x)
{
    int cnt=0;
    while(x<m)
    {
        cnt++;
        x=2*x;
    }
    return cnt;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        m=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            m=max(m,a[i]);
        }
        int ans=m;
        for(int i=1;i<=n;i++)
        {
            ans+=fun(a[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

2000毫秒

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n;
int a[200000];
int c=0;
int main()
{
while(scanf("%d",&n),n){
for(int i=0;i<n;i++){
    scanf("%d",&a[i]);
    if(c<a[i])c=a[i];
}
    int sum=0;
    for(int i=0;i<n-1;i++){
         while(a[i]<c)
        {a[i]*=2;
        sum++;
        }
        }

    printf("%d\n",sum+c);
}
return 0;
}
  • 写回答

1条回答 默认 最新

  • juliuswwj 2018-12-21 20:07
    关注

    如果sum是全局变量,那么编译器的实现一般是每次都要写物理内存。如果sum是局部变量,编译器一般都会优化成寄存器。
    寄存器和物理内存的读写速度差异差不多是一比几十的量级,总体结果就是速度差10倍。
    当然这个锅可以让编译器去背,它优化得不太好。

    建议你学一下汇编,多看看C变成汇编码,之后写代码就知道什么地方怎么写性能如何了。

    评论

报告相同问题?

悬赏问题

  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。