我有这段代码:
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;
}
答案 0 :(得分:2)
答案 1 :(得分:2)
据推测,第一个strchr会让你的代码提前退出,这样它就不需要做太多的处理了吗?