私はこのコードを持っている: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;
}
私は思ったものが、私は配列を印刷し、そのリストのすべての数字でいっぱいです。 – ZPS
は "1,2,3,4"が渡されたように正しくないようですが、 'strchr'チェックには決して来ません。理論的には、1つの余分な関数呼び出しを処理するのに時間がかかるはずです。 –
私は愚かで、明らかに逃しました。 strtokは渡された文字列を変更します。最初のパスの後、それはそのstrchrの後にドロップアウトします。 – ZPS