我需要在stdout上打印一定数量的空格,但这个数量不是固定的。我正在使用putchar(),但我不确定它是否快速。在C语言中打印一定数量的字符的最快方法是什么?同时,我不能使用系统函数。
谢谢你的帮助!
谢谢你的帮助!
我建议使用fwrite
函数。它简单、正确且易于理解。
void put_spaces(int n)
{
static const char SPACES[32] = " ";
for (; n >= 32; n -= 32)
fwrite(SPACES, 32, 1, stdout);
if (n)
fwrite(SPACES, n, 1, stdout);
}
然而需要注意的是,简单的版本也非常快速:
void put_spaces(int n)
{
while (n--)
putchar(' ');
}
putchar
是一个宏,大部分时间直接写入缓冲区。如果你不确定它是否快速,正确的答案是对你的应用程序进行性能分析,而不是“先优化”。malloc
(它只是不必要的),puts
(每次调用它都会添加'\n'
),以及printf
(对于这样一个简单的任务来说太复杂了)。我会尝试使用系统命令而不是自己编写。
类似这样:
void print_spaces(unsigned int number_of_spaces) {
char* spaces = malloc(sizeof(char)*number_of_spaces + 1);
memset (spaces,' ',number_of_spaces);
spaces[number_of_spaces] = '\0';
printf("%s",spaces);
free(spaces);
}
这个可以解决问题。
printf()
可以让你调整要打印的空格数,但是这必须在格式字符串中声明。可以参考这里。
char format[256];
sprintf(format, "%%%ds", number_of_spaces); // creates the format string
printf(format, " ");
package main
import (
"bufio"
"os"
)
func main() {
t := []byte{'y', '\n'}
var used int
const tot = 8192
buf := make([]byte, 0, tot)
for used < tot {
buf = append(buf, t...)
used += 2
}
//Filled complete array named as buf with "y\n"
w := bufio.NewWriter(os.Stdout)
for {
w.Write(buf) //using write system call to print.
}
w.Flush()
}
//syscall.Write({without buf}) : 1.40MiB/s
//syscall.Write(buf) : 1.5GiB/s
我猜你所说的“系统函数”是指非标准扩展。如果是这样,那就要看你是想写得最快还是执行得最快了?
如果是前者,并且假设有一个上限,那么你可以使用类似以下的代码:
void outSpaces (unsigned int num) {
static char *lotsaSpaces = " ";
printf ("%*.*s", num, num, lotsaSpaces);
}
void outSpaces (unsigned int num) {
static char *hundredSpaces = "<<insert 100 spaces here>>";
while (num >= 100) {
puts (hundredSpaces);
num -= 100;
}
printf ("%*.*s", num, num, hundredSpaces);
}
你需要意识到函数调用即使使用输出缓冲也可能会很耗费资源。在这种情况下,最好一次性调用puts
来输出一百个字符,而不是调用putchar
一百次。
也许:
void PrintSpaces (int num_spaces)
{
char *spaces = " "; /* twenty spaces */
while (num_spaces > 20)
{
puts (spaces);
num_spaces -= 20;
}
if (num_spaces)
{
puts (&spaces [19 - num_spaces]);
}
}
puts
,因为它没有检查 %
格式说明符的开销。 - paxdiabloputs
函数会在末尾添加一个换行符。 - Dietrich Epp#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
int main() {
const size_t size = 5;
char* const data = (char*)malloc(size * sizeof(char) + 1);
if (!data) {
return EXIT_FAILURE;
}
memset(data, ' ', size);
data[size] = '\0'; // not needed (in this case)
fwrite(data, sizeof(char), size, stdout);
free(data);
return EXIT_SUCCESS;
}
(如果空格数量不是过分的话)
sizeof(char)
始终为1。而为了将数据复制到另一个内存缓冲区中,分配内存缓冲区似乎是非常浪费的。 - Dietrich Eppsizeof(char)
显示意图。对于额外的缓冲区问题,setbuf(stream, NULL)
可能会有所帮助。不确定它在标准输出上是否按预期工作。对于一个实际文件的流,它应该可以工作,并且以二进制模式编写会更有帮助。 - Shadow2531setbuf(stream, NULL)
,我相当确定这将通过强制IO为每个stdio调用来破坏性能。 - Dietrich Epp