优化程序(c)

优化程序(c),c,optimization,C,Optimization,我有我的计划: #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char *argv[]) { int r, line = 0, found = 0; float temp, t_tot = 0; char loc[32]; FILE *fp; fp = fopen(argv[1], "r");

我有我的计划:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[])
{
    int r, line = 0, found = 0;
    float temp, t_tot = 0;
    char loc[32];


    FILE *fp;

    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        printf ("Error opening the file\n\n'");
        exit(EXIT_FAILURE);
    }

    if (argc == 3)
    {
        while ((r = fscanf(fp, "%f %s\n", &temp, loc)) != EOF)
        {
            line++;

            if (r == 2)
            {
                if(strcmp(argv[2], loc) == 0)
                {
                    t_tot += temp;
                    found++;
                }
            }
            else
                printf ("Error, line %d in wrong format!\n\n", line);
        }

        printf ("The average temperature in %s is: %.1f\n\n", argv[2], (t_tot/found));
    }

    fclose(fp)

    return 0;

}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int r,line=0,found=0;
浮子温度,t_tot=0;
char-loc[32];
文件*fp;
fp=fopen(argv[1],“r”);
如果(fp==NULL)
{
printf(“打开文件时出错\n\n”);
退出(退出失败);
}
如果(argc==3)
{
而((r=fscanf(fp,%f%s\n,&temp,loc))!=EOF)
{
line++;
如果(r==2)
{
如果(strcmp(argv[2],loc)==0)
{
t_tot+=温度;
发现++;
}
}
其他的
printf(“错误,第%d行格式错误!\n\n”,第行);
}
printf(“以%s为单位的平均温度为:%.1f\n\n”,argv[2],(t_tot/found));
}
fclose(fp)
返回0;
}
程序需要读取所有行并找到我在argv[2]上写的城市。然后它会告诉我该城市的平均温度,如果文件中的一行格式错误,就会通知我

我想知道如何“优化”这段代码,使其更高效,并以更“紧凑”的方式编写相同的内容。我是一名学生,所以所有的建议都被接受。

改变一下怎么样

if (r == 2)
{
    if(strcmp(argv[2], loc) == 0)
    {
        t_tot += temp;
        found++;
    }
} else {
    printf ("Error, line %d in wrong format!\n\n", line);
}
为此,要避免嵌套的if块,请执行以下操作:

if (r == 2 && strcmp(argv[2], loc) == 0) {
    t_tot += temp;
    found++;
} else if (r != 2) {
    printf ("Error, line %d in wrong format!\n\n", line);
}
我觉得干净多了

换衣服怎么样

if (r == 2)
{
    if(strcmp(argv[2], loc) == 0)
    {
        t_tot += temp;
        found++;
    }
} else {
    printf ("Error, line %d in wrong format!\n\n", line);
}
为此,要避免嵌套的if块,请执行以下操作:

if (r == 2 && strcmp(argv[2], loc) == 0) {
    t_tot += temp;
    found++;
} else if (r != 2) {
    printf ("Error, line %d in wrong format!\n\n", line);
}

我觉得干净多了

找一个剖析器,比如GNU GProf或者AMD CodeAnalyst

另见

然后以最高的优化程度编译程序,并尝试检查哪些部分往往需要花费大量时间

通常应避免在没有剖面仪的情况下进行优化


当我们进行计算时,您的程序实际上不会执行任何需要花费大量时间的计算,并且它的性能可能会受到I/O的限制(我猜)


你可以做的另一件事,而不是优化,是使其安全和正确——例如,如果输入文件中的字符串长度超过32个字符,它就不会崩溃。

获得一个分析器,比如GNU GProf或者AMD CodeAnalyst

另见

然后以最高的优化程度编译程序,并尝试检查哪些部分往往需要花费大量时间

通常应避免在没有剖面仪的情况下进行优化


当我们进行计算时,您的程序实际上不会执行任何需要花费大量时间的计算,并且它的性能可能会受到I/O的限制(我猜)


您可以做的另一件事,而不是优化,是使其安全且正确——例如,如果输入文件中的字符串长度超过32个字符,则不会崩溃。

您还可以使用编译器优化选项优化目标代码。对于gcc,只需添加
-O3
(或
-O1
-O2
,具体取决于优化级别)参数。

您还可以使用编译器优化选项优化目标代码。对于gcc,只需添加
-O3
(或
-O1
-O2
,取决于优化级别)参数。

这将更适合于。在我看来,这似乎结构良好。通常的做法是检查
顶部的
argc
,而不是返回到循环中的检查。这是一种常见的做法,例如,在我们使用时使用
GNU getopt
,这将更适合于。在我看来,这似乎结构良好。在
main
的顶部检查
argc
是一种常见的做法,而不是返回到循环中的检查。例如,在我们使用时使用
GNU getopt
,这是一种常见的做法:-)是的,但我认为避免嵌套块是值得的。为什么这是一种改进?这两个甚至编译成不同的汇编程序吗?@Kos这不是时间优化,你是对的。但我仍然认为这会使代码看起来更有条理。是的,但我认为避免嵌套块是值得的。为什么这是一种改进?这两个甚至编译成不同的汇编程序吗?@Kos这不是时间优化,你是对的。但我仍然认为这会使代码看起来更有条理。