C++ 快速C++;字符串输出
我有一个从FPGA输出数据的程序。由于数据变化非常快,我正试图提高程序的速度。现在我正在像这样打印数据C++ 快速C++;字符串输出,c++,c,string,performance,concatenation,C++,C,String,Performance,Concatenation,我有一个从FPGA输出数据的程序。由于数据变化非常快,我正试图提高程序的速度。现在我正在像这样打印数据 for (int i = 0; i < 100; i++) { printf("data: %d\n",getData(i)); } 但是,正如您所看到的,它非常混乱,我不能使用for循环。我尝试先使用sprintf连接字符串,然后立即打印所有内容,但速度和第一种方法一样慢。有什么建议吗 编辑: 我已经开始打印文件了,因为我意识到控制台滚动是个问题。但还是太慢了。我正在为外部F
for (int i = 0; i < 100; i++) {
printf("data: %d\n",getData(i));
}
但是,正如您所看到的,它非常混乱,我不能使用for循环。我尝试先使用sprintf
连接字符串,然后立即打印所有内容,但速度和第一种方法一样慢。有什么建议吗
编辑:
我已经开始打印文件了,因为我意识到控制台滚动是个问题。但还是太慢了。我正在为外部FPGA调试一个内存控制器,所以越接近实际速度越好。有多少数据?将其存储在RAM中,直到完成,然后打印。此外,文件输出速度可能更快。根据终端的不同,您的程序可能会阻塞写操作。您可能希望选择可写性,并直接写入标准输出
基本上,您不能在需要一致、可预测性能的东西上执行大量同步终端IO 如果你给标准输出写信,你可能无法影响这一切 否则,请设置缓冲
- setvbuf
- std::nounitbuf
- 和un
输入输出流(C++)tie
(谢谢@Dietmar)std::ios\u base::与stdio同步(false)
#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);
}
#包括
int getData(int i){return i;}
int main()
{
char buf[100*24];//或其他足够大的好东西
char*const last=buf+sizeof(buf);
char*out=buf;
对于(int i=0;i<100;i++){
out+=snprintf(out,last out,“数据:%d\n”,getData(i));
}
*out='\0';
printf(“%s”,buf);
}
尝试在字符串末尾打印\r
,而不是通常的\n
——如果这在您的系统上有效的话。这样你就不会连续滚动了
这取决于您的环境是否有效。当然,如果数据变化非常快,您将无法读取所有数据
您是否考虑过只打印第n个条目?我建议您将文本格式化为缓冲区,然后使用
fwrite
函数写入缓冲区
根据dasblinkenlight的答案,使用fwrite
而不是put
。put
函数正在搜索终止的nul字符。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);
}
char buf[]=“数据:0000000000\r\n”;
对于(int i=0;i<100;i++){
//int部分从位置6开始
itoa(getData(i),&buf[6],10);
//-1是因为我们不想写nul字符。
fwrite(buf,1,sizeof(buf)-1,stdout);
}
您可能希望将所有数据读入一个单独的原始数据缓冲区,然后将原始数据格式化为一个“格式化”数据缓冲区,最后使用一个fwrite
调用来爆破整个“格式化”数据缓冲区
您希望最小化发送数据的调用,因为这会带来开销。
fwrite
函数写入1个字符的开销与写入10000个字符的开销大致相同。这就是缓冲的作用。使用1024个项的缓冲区意味着您使用1个函数调用来写入1024个项,而1024个调用分别写入一个项。后者是1023个额外的函数调用。哇,我不敢相信我之前没有这么做
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));
}
const int size=100;
字符数据[大小];
对于(int i=0;i
正如我所说,
printf
是瓶颈,而sprintf
也没有多少改进。因此,我决定在最后一刻避免任何形式的打印,而是使用指针有没有机会存储数据并在之后打印它们?@evilluff我在回答中建议,同样,你有一个基准:STD::CUT,你真的能读得这么快吗?希望GETDATA是一个简单的例子,它是如何在打印之前缓冲所有的写的,因为你提到了C++的改进,涉及到流,第一个调用端口应该是代码> STD::iOSKBASE::SycSyOffStdio(false)< /C>。不过,只有第一个调用会影响printf()
。@DietmarKühl我知道我忘了一个:/谢谢!是的,我的答案是双轨的(我实际上是想展示Boost Karma,但是没有什么信息可以提供)。@sehe这和我已经做的有什么不同(使用sprintf连接所有字符串,然后在最后打印)?@woojoo666你可以保留for循环!(引用您的问题:“但是,正如您所看到的,它非常混乱,我不能使用for循环”)char buf[]=“data:0000000000\r\n”代码>如果是在自动内存成本复制(由隐藏的运行时),但如果是在静态内存是一个错误;
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));
}