我有一个从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调试内存控制器,因此越接近实际速度就越好。
答案 0 :(得分:6)
如果你正在写stdout,你可能无法影响这一切。
否则,设置缓冲
tie
输入输出流(C ++)http://en.cppreference.com/w/cpp/io/basic_ios/tie std::ios_base::sync_with_stdio(false)
(感谢@Dietmar)现在,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
代替puts
。 puts
函数正在搜索终止空字符。 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
也没有太大的改善。所以我决定避免任何类型的打印,直到最后,并使用指针