在 C 中输出 char 的二维数组的最快方法
Fastest way to output a 2D array of char in C
我正在做一个蛇游戏项目,但我刚刚意识到旧的 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 上进行。
怎么样
fwrite(base[y], MAX_X, 1, stdout)
一次写一整行
不,我还没有测试过它的速度
我正在做一个蛇游戏项目,但我刚刚意识到旧的 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 上进行。
怎么样
fwrite(base[y], MAX_X, 1, stdout)
一次写一整行
不,我还没有测试过它的速度