相关疑难解决方法(0)

为什么istream/ostream变慢

http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly的 50:40时,Andrei Alexandrescu开玩笑说如何效率/慢速istream.

我过去遇到过一个问题,ostream很慢,而且fwrite明显更快(在主循环运行一次时减少了很多秒),但我从来不明白为什么也没看过它.

什么使得C++中的istream和ostream变慢?或者至少比其他东西(如fread/fget,fwrite)慢,这同样满足了需求.

c++ performance istream ostream

35
推荐指数
3
解决办法
1万
查看次数

printf减慢了我的程序

我有一个小的C程序来计算哈希值(哈希表).我希望代码看起来很干净,但有一些与它无关的东西让我烦恼.

我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr/bin/time为基准).但是,当我在forf循环中使用printf()时,程序会减慢到大约5秒钟.

  1. 为什么是这样?
  2. 如何让它更快?mmapp()ing stdout也许?
  3. stdlibc是如何设计的,以及如何改进?
  4. 内核怎么能更好地支持它?如何修改本地"文件"(套接字,管道等)的吞吐量真的很快?

我期待着有趣而详细的回复.谢谢.

PS:这是一个编译器构造工具集,所以不要害羞进入细节.虽然这与问题本身无关,但我只想指出细节让我感兴趣.

附录

我正在寻找更多解决方案和解释的程序方法.确实,管道工作起了作用,但我无法控制"用户"的作用.

当然,我现在正在进行测试,"普通用户"不会这样做.但这并没有改变一个简单的printf()减慢一个进程的事实,这是我试图找到一个最佳的编程解决方案的问题.


附录 - 惊人的结果

参考时间用于TTY内的普通printf()调用,大约需要4分钟20秒.

在/ dev/pts(例如Konsole)下进行测试可将输出速度提高到约5秒.

在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒.

setbuffer()在使用时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒).

令人惊讶的是,如果我在TTY1上开始测试然后切换到另一个TTY,它确实需要与PTS相同:大约5秒.

结论:内核做了一些与可访问性和用户友好性有关的事情.呵呵!

通常情况下,无论你是在活动时盯着TTY还是切换到另一个TTY,它都应该同样慢.


课程:运行输出密集型程序时,切换到另一个TTY!

c performance glibc stdout linux-kernel

26
推荐指数
5
解决办法
1万
查看次数

为什么snprintf比ostringstream更快还是它?

我在某处读到snprintf比ostringstream更快.有没有人有这方面的经验?如果是,为什么它更快.

c c++ performance

22
推荐指数
3
解决办法
2万
查看次数

C++ cout打印很慢

我注意到如果我使用cout打印出长字符串(char*),它似乎一次打印1个字符到Windows 7,Vista和Linux(使用putty)的屏幕上,使用Windows上的Visual C++ 2008和Linux上的G ++.Printf是如此快得多,我实际上从cout切换到printf,用于我的项目中的大多数打印.这让我感到困惑,因为这个问题让我觉得我是唯一一个有这个问题的人.

我甚至写了一个cout替换,看起来像是在我的comp上击败cout的裤子 -

class rcout
{
public:
    char buff[4096];
    unsigned int size;
    unsigned int length;

    rcout()
    {
        size = 4096;
        length = 0;
        buff[0] = '\0';
    }

    ~rcout()
    {
        printf("%s", buff);
    }

    rcout &operator<<(char *b)
    {
        strncpy(buff+length, b, size-length);
        unsigned int i = strlen(b);
        if(i+length >= size)
        {
            buff[size-1] = '\0';
            printf("%s", buff);
            b += (size-length) -1;
            length = 0;
            return (*this) << b;
        }
        else
            length += i;
        return (*this);
    }

    rcout &operator<<(int …
Run Code Online (Sandbox Code Playgroud)

c++ performance cout

7
推荐指数
2
解决办法
9100
查看次数

造成这种差异的原因......从C++到C?

我想知道为什么会一直这样...... !! 我在c中编写了两个程序,在c ++中编写了另一个程序.两者都执行相同的操作.即打印1到2000000之间的数字.此外,我在执行开始时设置计时器..并且在打印之后还打印所有经过的时间.c ++程序所用的时间总是大于交流程序.我觉得时间差异很大.我很想知道这是什么原因.. ???? ..

这是两个程序

//iotest.c

#include<stdio.h>
#include<time.h>

clock_t start=clock();

int main()
{
for(int i=0;i<2000000;i++)

printf("%d\n",i);

printf("Time Elapsed: %f\n",((double)clock()-start)/CLOCKS_PER_SEC);

return 0;

}
Run Code Online (Sandbox Code Playgroud)

//iotest.cpp

#include<iostream>

#include<time.h>

using namespace std;

clock_t start=clock();

int main()
{
    for(int i=0;i<2000000;i++)

    cout<<i<<endl;

    cout<<"Time elapsed "<<((double)clock()-start)/CLOCKS_PER_SEC<<endl;

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

// ver C++ 4.3.2通过发出命令编译c程序

g ++ iotest.c

执行给出

1

.

.

2000000

经过的时间:5.410000(并不总是相同..)

执行第二个程序

1

.

.

2000000

时间流逝:5.81(并非总是相同..)

c c++

5
推荐指数
3
解决办法
585
查看次数

为什么我们在C++中使用printf()函数?

为什么我们在c ++中使用printf()&scanf()函数?

c++

4
推荐指数
4
解决办法
2209
查看次数

printf()将其参数转换为像cout一样的字符串吗?

我开始从C学习C++.最近,我刚读了一本关于C++的教程.在" 介绍流 "一节中,本书注意到:

<<运算符被重载,因此右侧的操作数可以是字符串或任何原始值.如果此操作数不是字符串,则<<运算符在将其发送到输出流之前将其转换为字符串形式.

所以我想知道printf()C中的函数是否具有相同的效果.如果没有,请告诉我他们两者之间的差异.

c c++

2
推荐指数
1
解决办法
144
查看次数

哪个更快,哪个更灵活:printf或cout?

可能重复:
在C++ cin或printf中printf vs cout

我一直想知道printf和cout ..哪一个最终更快,并且它也是最灵活的(即可以打印一系列变量,输出可以格式化)?

PS我知道这看起来类似于C++中的'printf'和'cout',但我并不是真的在问同样的事情.

c++ printf cout

1
推荐指数
1
解决办法
1006
查看次数

为什么 printf 在 C++ 中执行得比 cout 快?而且 scanf 比 cin 慢,为什么?

我制作了一些程序,发现 scanf 和 printf 比使用 cin 和 cout 快得多?

c++

-1
推荐指数
1
解决办法
101
查看次数

标签 统计

c++ ×8

c ×4

performance ×4

cout ×2

glibc ×1

istream ×1

linux-kernel ×1

ostream ×1

printf ×1

stdout ×1