Почему бы использование strchr перед использованием strtok ускорить время выполнения? - PullRequest
4 голосов
/ 09 августа 2011

У меня есть этот код:

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 ]

2 голосов
/ 09 августа 2011

Предположительно, что первый strchr заставляет ваш код выпадать раньше, чтобы он не занимал так много обработки?

2 голосов
/ 09 августа 2011

Кажется странным? Вы тестируете оба кода на одной машине? и сколько раз вы взяли образец? и какой код вы используете для расчета времени? Пожалуйста, поделитесь этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...