快速C ++字符串输出

时间:2013-08-23 21:29:13

标签: c++ c string performance concatenation

我有一个从FPGA输出数据的程序。由于数据变化非常快,我正在努力提高程序的速度。现在我打印这样的数据

for (int i = 0; i < 100; i++) {
    printf("data: %d\n",getData(i));
}

我发现使用一个printf可以大大提高速度

printf("data: %d \n data: %d \n data: %d \n",getData(1),getData(2),getData(3));

然而,正如你所看到的,它非常凌乱,我不能使用for循环。我首先尝试使用sprintf连接字符串,然后立即打印出所有字符串,但它和第一种方法一样慢。有什么建议吗?

编辑: 我已经先打印到文件了,因为我意识到控制台滚动会成为一个问题。但它仍然太慢。我正在为外部FPGA调试内存控制器,因此越接近实际速度就越好。

5 个答案:

答案 0 :(得分:6)

如果你正在写stdout,你可能无法影响这一切。

否则,设置缓冲

现在,Boost Karma的表现非常出色。但是,我需要了解有关输入数据的更多信息。

同时,尝试手动缓冲您的写入: Live on Coliru

#include <stdio.h>

int getData(int i) { return i; }

int main()
{
    char buf[100*24]; // or some other nice, large enough size
    char* const last = buf+sizeof(buf);
    char* out = buf;

    for (int i = 0; i < 100; i++) {
        out += snprintf(out, last-out, "data: %d\n", getData(i));
    }

    *out = '\0';
    printf("%s", buf);
}

答案 1 :(得分:1)

多少数据?将它存储在RAM中直到完成,然后打印出来。此外,文件输出可能更快。根据终端,您的程序可能会阻止写入。您可能希望选择可写性并直接写入STDOUT。

基本上你不能在你需要一致,可预测的性能的东西上做很多synrhconous终端IO。

答案 2 :(得分:0)

尝试在字符串的末尾打印\r而不是通常的\n - 如果它适用于您的系统。这样你就不会连续滚动。

这取决于您的环境是否有效。当然,如果快速更改 ,您将无法读取所有数据。

您是否考虑过只打印每个 n 条目?

答案 3 :(得分:0)

我建议您将文本格式化为缓冲区,然后使用fwrite函数编写缓冲区。

建立dasblinkenlight的答案,使用fwrite代替putsputs函数正在搜索终止空字符。 fwrite函数按原样写入控制台。

char buf[] = "data: 0000000000\r\n";
for (int i = 0; i < 100; i++) {
    // int portion starts at position 6
    itoa(getData(i), &buf[6], 10);

    // The -1 is because we don't want to write the nul character.
    fwrite(buf, 1, sizeof(buf) - 1, stdout);
}

您可能希望将所有数据读入单独的原始数据缓冲区,然后将原始数据格式化为“格式化”数据缓冲区,最后使用fwrite调用来激活整个“格式化”数据缓冲区。

您希望最小化发送数据的调用,因为涉及开销。 fwrite函数写入1个字符的开销与写入10,000个字符的开销大致相同。这就是缓冲的用武之地。使用1024个缓冲区项目意味着您使用1个函数调用来编写1024个项目,而1024个调用每个编写一个项目。后者是1023个额外的函数调用。

答案 4 :(得分:0)

哇,我不敢相信我之前没有这样做过。

int size = 100;
char data[size];
for (int i = 0; i < size; i++) {
    *(data + i) = getData(i);
}

for (int i = 0; i < size; i++) {
    printf("data: %d\n",*(data + i));
}

正如我所说,printf是瓶颈,sprintf也没有太大的改善。所以我决定避免任何类型的打印,直到最后,并使用指针