【问题标题】:Fastest way to output a 2D array of char in C在 C 中输出二维字符数组的最快方法
【发布时间】:2015-03-30 08:37:26
【问题描述】:

我只是在做一个蛇游戏项目,但我刚刚意识到旧的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");
 }

【问题讨论】:

  • printf() 是“慢”。你最好用你的单个字符构建一个更长的字符串并输出一次大字符串,而不是输出每个单独的字符。
  • 您可以尝试只打印数组中发生变化的部分,而不是每次要更新屏幕时打印整个数组。
  • 没有 Szoke,寻求帮助并声明您希望在同一个问题中获得完整版权...?无论如何.....学习opengl或directx(谷歌他们)。或者购买一台基于 i7 的 PC……并使用控制台进行输出……预算为零。但说真的,google OpenGL....它是用于显示图形的。
  • 我试过了,但是当我编译时,程序会变得混乱。 Lol Gavin 那是个笑话 :p 我只能编程 C
  • printffor 一样古老(至少在 C 中)...

标签: c performance io


【解决方案1】:

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

【讨论】:

  • 你测量速度增益了吗?
  • 在我的机器上printf 版本大约慢了 2 倍。printf 必须至少解码两个参数,检测字符串结尾,测试格式字符串中的 %;所以需要慢一点。
  • 那是用户时间(“u”)吗?如果是,实时如何变化(如果有)?你的时间很快,你是在原生 linux 上吗?重定向到 /dev/null 时是否有任何变化(这使得它在 cygwin 上快 10 倍)?
  • 我测试了将所有重定向到 /dev/null 而不是测量设备 I/O。我会给你终端输出时间...
  • 哦。好吧,那我建议你不要用100000。
【解决方案2】:

怎么样

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

一次写一整行

不,我没有测试过它的速度

【讨论】:

  • fwrite 不写入 txt 文件?
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2017-01-26
  • 2015-04-08
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多