У меня есть этот код:
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;
}