2011-08-09 7 views
4

私はこのコードを持っている:strtokを使用する前にstrchrを使用してランタイムをスピードアップするのはなぜですか?

void 
fill_array (unsigned int *iarray, char *string, int max) 
{ 
    int ipos = 0; 
    char *iholder; 

    iholder = strtok (string, ","); 
    while (iholder != NULL) 
    { 
     iarray[ipos++] = atoi (iholder); 
     if (ipos == max) 
    { 
     return; 
    } 
     iholder = strtok (NULL, ","); 
    } 

} 

それは、例えば、「1,2,3,4」の文字列を取得し、配列に数値を入力します。 これをループに入れ、実行時間は3.3秒です。このコードでは

void 
fill_array (unsigned int *iarray, char *string, int max) 
{ 
    int ipos = 0; 
    char *iholder; 
    if (!strchr (string, ',')) 
    { 
     iarray[0] = atoi (string); 
     return; 
    } 
    iholder = strtok (string, ","); 
    while (iholder != NULL) 
    { 
     iarray[ipos++] = atoi (iholder); 
     if (ipos == max) 
    { 
     return; 
    } 
     iholder = strtok (NULL, ","); 
    } 

} 

それは実行に約1.4秒を要しました。

唯一の違いは、私が挿入するstrchrが単一の数値で高速に実行されるかどうかを確認することですが、何らかの理由で長いリストで実行するほうがはるかに高速です。

誰でも理由を説明できますか?

私はこのコードをテストしてい:

int main() 
{ 
    unsigned int iarray[5]; 
    char str_test[] = "56,75,22,83"; 
    int i; 
    struct timeval start; 
    struct timeval end; 

    gettimeofday (&start, NULL); 


    for (i = 0; i < 10000000; i++) 
    { 
     fill_array (iarray, str_test, 5); 
    } 

    gettimeofday (&end, NULL); 
    if (end.tv_usec - start.tv_usec < 0) 
    { 
     end.tv_usec += 1000000L; 
     end.tv_sec -= 1; 
    } 

    printf ("Runtime: %ld s %03ld ms\n", 
     end.tv_sec - start.tv_sec, (end.tv_usec - start.tv_usec)/1000); 

    return 0; 
} 

答えて

2

おそらく最初のstrchrがコードを先にドロップしてしまい、多くの処理をする必要はありません。

+0

私は思ったものが、私は配列を印刷し、そのリストのすべての数字でいっぱいです。 – ZPS

+0

は "1,2,3,4"が渡されたように正しくないようですが、 'strchr'チェックには決して来ません。理論的には、1つの余分な関数呼び出しを処理するのに時間がかかるはずです。 –

+1

私は愚かで、明らかに逃しました。 strtokは渡された文字列を変更します。最初のパスの後、それはそのstrchrの後にドロップアウトします。 – ZPS

2

は奇妙に思えますか?両方のコードを同じマシンでテストしていますか?サンプルを何回撮りましたか?時間を計算するために使用しているコードは何ですか?それも共有してください。

+0

私はWindowsでDev-C++とDebianマシンでテストしましたが、両方ともstrchrを追加することでより速いランタイムが得られました。 – ZPS

+0

時間測定にプロファイラを使用していますか、それともいくつかのコードを書いていますか?もしそうなら、それを分けてください。 –

+0

@ZPS、 'strtok'はあなたが渡している文字列の内容を変更していることを忘れないでください。最初の実行後に文字列を渡すと、 、22,83 "である。 1つのことをテストし、 'string'パラメータの内容も出力し、デバッグのための短い時間を2回言う。 –

関連する問題