相关疑难解决方法(0)

C++标准是否要求iostream的性能不佳,或者我只是处理糟糕的实现?

每当我提到C++标准库iostream的慢性能时,我都会遇到一阵难以置信的风潮.然而,我有剖析器结果显示在iostream库代码中花费了大量时间(完全编译器优化),并且从iostream切换到特定于操作系统的I/O API和自定义缓冲区管理确实提供了一个数量级的改进.

C++标准库做了多少额外工作,标准是否需要它,它在实践中是否有用?或者有些编译器提供了与手动缓冲区管理竞争的iostream实现吗?

基准

为了解决问题,我编写了几个简短的程序来练习iostreams内部缓冲:

请注意,ostringstreamstringbuf版本运行的迭代次数较少,因为它们的速度要慢得多.

在ideone上,它ostringstreamstd:copy+ back_inserter+ 慢大约3倍std::vector,比memcpy原始缓冲区慢大约15倍.当我将实际应用程序切换到自定义缓冲时,这与前后分析一致.

这些都是内存缓冲区,因此iostream的缓慢不能归咎于缓慢的磁盘I/O,过多的刷新,与stdio的同步,或者人们用来解释C++标准库观察到的缓慢的任何其他事情iostream的.

很高兴看到其他系统上的基准测试和常见实现的评论(例如gcc的libc ++,Visual C++,Intel C++)以及标准规定了多少开销.

此测试的基本原理

许多人都正确地指出,iostream更常用于格式化输出.但是,它们也是C++标准提供的二进制文件访问的唯一现代API.但是对内部缓冲进行性能测试的真正原因适用于典型的格式化I/O:如果iostreams无法保持磁盘控制器提供原始数据,那么当他们负责格式化时,他们怎么可能跟上呢?

基准时间

所有这些都是outer(k)循环的每次迭代.

在ideone上(gcc-4.3.4,未知的操作系统和硬件):

  • ostringstream:53毫秒
  • stringbuf:27毫秒
  • vector<char>并且back_inserter:17.6毫秒
  • vector<char> 与普通迭代器:10.6毫秒
  • vector<char> 迭代器和边界检查:11.4 ms
  • char[]:3.7毫秒

在我的笔记本电脑上(Visual C++ 2010 x86,cl …

c++ performance iostream

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

在用 C 编写的自定义 shell 程序中重定向 I/O

我一直在研究一个自定义 shell 脚本,并且在使用下面给出的代码重定向输出时遇到了一个小错误。在当前状态下,代码可以完美运行,但是当传递给 execvp args 时,会抛出错误,例如:(ls ">" no such file or directory)。我知道这是因为它将整个 args[] 传递给父 shell,而父 shell 不起作用。添加 args[j] = NULL 会消除“<”/ ">”,从而修复错误,但也会导致重定向不再起作用。我怎样才能让它不抛出错误而且还能正常工作?我已经阅读了这个问题的多个版本,但似乎找不到答案。预先感谢您的任何帮助。

switch (fork()){
        case -1:
        fprintf(stderr, "error forking");

        case 0://CHILD

        for(int j = 0; j < size; j++){

            if(!strcmp(args[j], "<")){//looking for input character
            ++ext;
            if((in = open(args[j+1], O_RDONLY)) < 0){//open file for reading
                fprintf(stderr, "error opening file\n");
            }
            dup2(in, STDIN_FILENO);//duplicate stdin to input file
            close(in);//close after use
            //args[j] = NULL;
                }//end input chech


            if(!strcmp(args[j],">")){//looking for output character
            ++ext;
                out …
Run Code Online (Sandbox Code Playgroud)

c shell redirect

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

为什么std :: hex会导致内存损坏vector.size()?

我有以下代码:

vector<UINT_PTR> test = GetMemoryAddresses();

cout << "Size: " << test.size() << endl;

for (UINT_PTR a : test) {
    cout << "Memory Address: " << hex  << a << endl;
}

cout << "Size: " << test.size() << endl;
Run Code Online (Sandbox Code Playgroud)

打印以下结果:

Size: 18
Memory Address: fc06a0
Memory Address: 13a70f0
Memory Address: 36c78c1
Memory Address: 3da0ea0
Memory Address: 3e21b80
Memory Address: c0a6881
Memory Address: c747690
Memory Address: c748b98
Memory Address: c74a1b8
Memory Address: c74ce10
Memory Address: c750c78
Memory Address: 1340a10f
Memory Address: …
Run Code Online (Sandbox Code Playgroud)

c++ iostream memory-corruption

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

标签 统计

c++ ×2

iostream ×2

c ×1

memory-corruption ×1

performance ×1

redirect ×1

shell ×1