Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速C++;字符串输出_C++_C_String_Performance_Concatenation - Fatal编程技术网

C++ 快速C++;字符串输出

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

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

for (int i = 0; i < 100; i++) {
    printf("data: %d\n",getData(i));
}
但是,正如您所看到的,它非常混乱,我不能使用for循环。我尝试先使用
sprintf
连接字符串,然后立即打印所有内容,但速度和第一种方法一样慢。有什么建议吗

编辑:
我已经开始打印文件了,因为我意识到控制台滚动是个问题。但还是太慢了。我正在为外部FPGA调试一个内存控制器,所以越接近实际速度越好。

有多少数据?将其存储在RAM中,直到完成,然后打印。此外,文件输出速度可能更快。根据终端的不同,您的程序可能会阻塞写操作。您可能希望选择可写性,并直接写入标准输出


基本上,您不能在需要一致、可预测性能的东西上执行大量同步终端IO

如果你给标准输出写信,你可能无法影响这一切

否则,请设置缓冲

  • setvbuf
  • std::nounitbuf
  • 和un
    tie
    输入输出流(C++)
  • std::ios\u base::与stdio同步(false)
    (谢谢@Dietmar)
现在,提升业力被认为是非常有效的。但是,我需要更多地了解您的输入数据

同时,尝试手动缓冲写操作:

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