在C中输出二维char数组的最快方法

时间:2015-01-30 19:25:51

标签: c performance io

我正在研究一个蛇游戏项目,但我刚刚意识到旧的printf太慢而无法显示15 * 45的二维数组。

如果您知道任何输出更快的I / O请帮助我!

我的目标是大约0.10 - 0.15秒。

我也接受图书馆,但我想要完全版权:p:p。

for (y = 0; y < MAX_Y ; y++) 
 {
  printf ("\t");
  for (x = 0; x < MAX_X; x++)
   {
    printf ("%c", base[y][x]);  
   }
  printf ("\n");
 }

2 个答案:

答案 0 :(得分:3)

由于您不使用真实格式,并且只打印单个字符,因此您可以使用简单的putchar()函数:

for (y = 0; y < MAX_Y ; y++) 
 {
  putchar ('\t');
  for (x = 0; x < MAX_X; x++)
   {
    putchar(base[y][x]);  
   }
  putchar('\n');
 }

在我的机器上,迭代循环100,000,在3次运行中测试它并将输出重定向到/dev/null,给了我:

  • 6.679u,6.663u和6.766u printf
  • 3.309u,3.315u和3.312u putchar
  • 0.263u,0.261u和0.263u(putchar_unlocked)。

如果我使用终端输出,我有:

  • 8.153u,printf
  • 3.862u,putchar
  • 0.634u putchar_unlocked

经过的时间是:

  • 0:09.46 printf
  • 0:07.75与putchar
  • 0:05.06 with putchar_unlocked

-Edit ----单 ---------

您还可以将所有内容分组到一个字符串中并使用puts,如下所示:

 char baseString[MAX_Y*(MAX_X+2)+1];
 int p = 0;
 for (int y = 0; y < MAX_Y ; y++) 
   {
     baseString[p++] = '\t';
     for (int x = 0; x < MAX_X; x++)
       {
         baseString[p++] = base[y][x];  
       }
     baseString[p++] = '\n';
   }
 baseString[p] = 0;
 puts(baseString); // or fwrite(baseString,p,1,stdout);

在这种情况下,测试给出:

  • 0.448u,1.155s和0:04.99(put)
  • 0.418u,1.077s,0:04.81(fwrite)

这比putchar_unlocked略好。

所有测试均在OSX 10.9,Intel Core i7 2.3Ghz上进行。

答案 1 :(得分:0)

怎么样

fwrite(base[y], MAX_X, 1, stdout)

一次写一整行

不,我没有测试它的速度