我有这段代码:
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;
}
strtok
会修改你传递的字符串内容,而且由于你一遍又一遍地传递同一个字符串,所以我认为在第一次执行后,传递的字符串将不再包含实际值“56,75,22,83”。测试一下,也打印一下string
参数的内容,并循环少一些时间进行调试,比如只循环2次。 - Muhammad Ummar