2012-03-10 4 views
0

を最適化することは、私のCコード..ですここでここではCコード

void Read(int t,char* string1) 
{ 
    int j,i,p,row,count=0; 
    for(i=0;i<t;++i,string1=strchr(string1,')')+2) 
    { 
     sscanf(string1,"(%d,%d)",&p,&row); 
     CallFunction(p,row); 
    } 
} 

は、私は、この関数を呼び出す必要があります方法です:

Read(2,"(3,5),(7,8)") 

が、これは、入力パラメータのような種類に対処するための良い方法です。 ?それは時間がかかりますか?

同じ入力パラメータを読み取る他の良い方法(最適化された方法)はありますか?

+2

は、なぜあなたはそれを最適化する必要があると思いますか? –

+0

これが入力のこの種類または他のよりよい方法を読む唯一の方法であるかどうか2を知りたがった – Jay

+0

早期最適化はすべての悪の根源です。ちなみに、 'for'ループの中で' string1 = strchr(string1、 ')')+ 2'を動かすなど、パフォーマンスを損なうことなく、このコードを読みやすくすることができます。 –

答えて

0

このコードはかなり高速です。しかし、それがどれほど速くなる必要があるかは、私にはわからないあなたの制約に依存します。

私はstring1=strchr(string1,')')+2(と続くもの)が安全ではないので、あなたの入力データが既にチェックされていることを願っています。

本当にがメタル速度に耐える必要がある場合、関数呼び出しを取り除き、手動で(文字列を自分で解析する)作業を行う必要があります。

しかし、あなたが公開している「API」与えられた、スピードの問題は、このコードスニペットの上方と下方に敗北することができます。その後、最適なコード・チェーンへの到達

は上...すべてのチェーンによって異なります。全体がチェーンで最も遅い関数より速く実行されません。

申し訳ありませんが、より具体的にはありませんが、これは本当にあなたが提供した情報は私が(私は全体像を持っていない)、それに対処することができますよりも、よりグローバルな問題です。

1

sscanf()の%n書式指定子を使用すると、strchr()関数を省略できます。スピードの向上はおそらく僅かです。

ところで、大文字と小文字を区別するコンパイラとリンカを想定することはできません。

#include <stdio.h> 

#define CallFunction(a,b) fprintf(stderr, "p=%d row=%d\n", a, b) 

void do_read(int cnt,char *input) 
{ 
    int i,err,p,row,res; 

    for(i=0; i<cnt ; i++,input += res) 
    { 
     err = sscanf(input,"(%d,%d)%n",&p,&row, &res); 
     if (err < 2) { 
       fprintf(stderr, "%s:%d: input='%s', err=%d\n" 
         , __FILE__ , __LINE__, input, err); 
       break; 
       } 
     CallFunction(p,row); 
     if (input[res] == ',') res++; 
    } 
} 

int main(void) 
{ 
do_read(2,"(3,5),(7,8)"); /* this should succeed */ 
do_read(2,"(3,5)#(7,8)"); /* this must fail ... */ 

return 0; 
} 
関連する問題