2012-06-23 67 views
0

我有我的計劃:優化程序(C)

#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; 

} 

程序需要讀取所有的行,發現我在寫的argv城[2]。它會告訴我該城市的平均氣溫,通知我文件中的某一行是否格式錯誤。

我想知道如何「優化」這個代碼,以便更有效率,並以更緊湊的方式編寫相同的東西。我是一名學生,所有的建議都被接受。

+3

這會更適合於http://codereview.stackexchange.com。 –

+0

在我看來,結構尚好。 –

+0

檢查'main'頂部的'argc'是一種常見的做法,而不是返回循環中的檢查。 – dasblinkenlight

回答

0

有關更改

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); 
} 

看起來比較清爽了很多給我!

+3

除了你現在[重複你自己](http://en.wikipedia.org/wiki/) DRY)... –

+0

是的,但我認爲這是值得的,避免嵌套塊。 – v1Axvw

+0

爲什麼這是一個改進?這兩個甚至編譯成不同的彙編器? – Kos

3

獲得一個剖析器像GNU GProf或AMD CodeAnalyst。

又見What's the best free C++ profiler for Windows?

然後用最高的優化編譯程序,並嘗試檢查哪些部件往往要花費很多時間。

通常不需要優化探查器。


雖然我們在這,你的程序並沒有真正做到這一點就需要大量時間任何計算,其性能可能會受到I/O(我猜測)的約束。

您可以做的另一件事,而不是優化,是使其安全和正確 - 例如,以便它不會崩潰,如果輸入文件中的字符串超過32個字符。

1

您還可以使用編譯器優化選項優化目標代碼。對於gcc,只需添加-O3(或-O1-O2,取決於優化級別)參數。