为什么在使用strtok加速运行时之前使用strchr?

时间:2011-08-09 06:35:34

标签: c performance optimization

我有这段代码:

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 个答案:

答案 0 :(得分:2)

好像很奇怪?你在同一台机器上测试两个代码吗?你有多少次采样?你用来计算时间的代码是什么?请分享一下。

答案 1 :(得分:2)

据推测,第一个strchr会让你的代码提前退出,这样它就不需要做太多的处理了吗?