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

标签 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");
 }

最佳答案

由于您不使用真正的格式,并且只打印单个字符,因此您可以使用简单的 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,putchar_unlocked

-编辑----单--------

您还可以将所有内容分组到一个字符串中并使用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(看跌)
  • 0.418u, 1.077s, 0:04.81 (fwrite)

这比 putchar_unlocked 稍微好一些。

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

关于c - 在 C 中输出 char 的二维数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243184/

相关文章:

Java System.out.print 效率

c - 文件读取程序在 while 循环结束时挂起 (linux c)

c++ - 如何从 C++ 程序中打开自定义 I/O 流?

c - 注意 : C++ does not support default-int

c - 关于随机数生成

c - USB 描述符的 ID_SERIAL 和 ID_SERIAL_SHORT udev 属性有什么区别

haskell中与 "imperative"算法相关的性能

c - 用 calloc 分配的多维数组

java - "Fast"Java中的整数幂

types - 为什么Go的io包中没有RuneWriter接口(interface)?