woo*_*666 5 c c++ string performance concatenation
我有一个程序从FPGA输出数据.由于数据变化非常快,我正在努力提高程序的速度.现在我打印这样的数据
for (int i = 0; i < 100; i++) {
printf("data: %d\n",getData(i));
}
Run Code Online (Sandbox Code Playgroud)
我发现使用一个printf可以大大提高速度
printf("data: %d \n data: %d \n data: %d \n",getData(1),getData(2),getData(3));
Run Code Online (Sandbox Code Playgroud)
但是,正如你所看到的,它非常凌乱,我不能使用for循环.我首先尝试连接字符串sprintf,然后立即打印所有字符串,但它和第一种方法一样慢.有什么建议?
编辑:我已经首先打印到文件,因为我意识到控制台滚动将是一个问题.但它仍然太慢.我正在为外部FPGA调试内存控制器,因此越接近实际速度越好.
如果你正在写stdout,你可能无法影响这一切.
否则,设置缓冲
tie输入输出流(C++)http://en.cppreference.com/w/cpp/io/basic_ios/tiestd::ios_base::sync_with_stdio(false) (感谢@Dietmar)现在,Boost Karma的表现非常出色.但是,我需要了解有关输入数据的更多信息.
同时,尝试手动缓冲您的写入:在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);
}
Run Code Online (Sandbox Code Playgroud)
哇,我不敢相信我之前没有这样做。
const 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));
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,printf这是瓶颈,而且sprintf也没有多大改进。所以我决定直到最后才避免任何类型的打印,而是使用指针