当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么snprintf比ostringstream更快还是它?》经验,为你挑选了3个好方法。

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



1> Max Lybbert..:

std::ostringstream要求较慢,但实施时通常较慢. FastFormat的网站有一些基准.

流的标准库设计支持的远不止snprintf于此.该设计旨在是可扩展的,并包括protected virtual由公开的方法调用的方法.这允许您从其中一个流类派生,并确保如果重载protected方法,您将获得所需的行为.我相信编译器可以避免virtual函数调用的开销,但我不知道有任何编译器.

此外,流操作通常在内部使用可增长的缓冲区; 这意味着内存分配相对较慢.


一个原因是字符串流通常是线程安全的,而snprintf不是,因此存在一些开销.
`printf`函数系列支持语言环境,就像`iostream`一样.@kotlinski:它们也是线程安全的.

2> user52875..:

我们用sprintf(使用静态分配的缓冲区)替换了内部循环中的一些字符串流,这在msvc和gcc中都有很大的不同.我想这个代码的动态内存管理:

{
  char buf[100];
  int i = 100;
  sprintf(buf, "%d", i);
  // do something with buf
}

比...简单得多

{
  std::stringstream ss;
  int i = 100;
  ss << i;
  std::string s = ss.str();
  // do something with s
}

但我对stringstreams的整体表现非常满意.



3> Johannes Sch..:

有些人可能会告诉你,功能不能比彼此快,但是它们的实现可以.那是对的,我想我会同意的.

你不太可能注意到基准以外的其他差异.c ++流通常趋于缓慢的原因是它们更灵活.灵活性通常以时间或代码增长为代价.

在这种情况下,C++流基于流缓冲区.流本身只是保持格式化和错误标志的船体,并调用i/oc ++标准库的正确方面(例如,num_put打印数字),将格式良好的值打印到底层流中 -连接到c ++流的缓冲区.

所有这些机制 - 方面和缓冲区都是由虚函数实现的.虽然确实没有标记注释,但这些函数必须实现为比c stdio吊坠慢,事实上它们会比通常使用c stdio函数慢一些(我在一段时间之前使用gcc/libstdc ++进行基准测试,实际上已经注意到了减速 - 但你在日常使用中几乎没有注意到).

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有