在C中用stdout打印一定数量字符的最快方法

时间:2011-05-12 08:34:04

标签: c printing stdout

我必须向stdout打印一定数量的空格,但这个数字不固定。我正在使用putchar(),但我不确定这是否很快。在C中将特定数量的字符打印到stdout的最快方法是什么?另外,我不能使用系统功能。

谢谢你的帮助!

7 个答案:

答案 0 :(得分:3)

我会使用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(这对于一个简单的任务)。

答案 1 :(得分:0)

printf()允许您调整要打印的空格数,但必须在格式字符串中说明。请here作为参考。

char format[256];
sprintf(format, "%%%ds", number_of_spaces); // creates the format string
printf(format, " ");

答案 2 :(得分:0)

我假设“系统功能”,你的意思是非标准扩展。在这种情况下,这完全取决于你的写作速度最快还是执行速度最快?

如果是前者,假设有一个上限,你可以使用类似的东西:

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一百次。

答案 3 :(得分:0)

也许:

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]);
  }
}

答案 4 :(得分:0)

我会尝试使用系统命令而不是自己创建。

类似的东西:

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);
}

会做到这一点。

答案 5 :(得分:0)

#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;
}

(如果空格的数量不是很大)

答案 6 :(得分:0)

我不知道c,但这是基本的想法。 创建一个大小为8192的数组,并用空格完全填充该特定数组,现在您可以使用put或write系统调用或使用有效的东西,然后打印此数组。 在这里我有一个代码片段,但是如果你更喜欢c,你可以看到example你如何做到这一点,它实际上是GNU的是程序,在打印东西时速度很快,有随后的解释

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