我在某处读到snprintf比ostringstream更快.有没有人有这方面的经验?如果是,为什么它更快.
std::ostringstream
不要求较慢,但实施时通常较慢. FastFormat的网站有一些基准.
流的标准库设计支持的远不止snprintf
于此.该设计旨在是可扩展的,并包括protected
virtual
由公开的方法调用的方法.这允许您从其中一个流类派生,并确保如果重载protect
ed方法,您将获得所需的行为.我相信编译器可以避免virtual
函数调用的开销,但我不知道有任何编译器.
此外,流操作通常在内部使用可增长的缓冲区; 这意味着内存分配相对较慢.
我们用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的整体表现非常满意.
有些人可能会告诉你,功能不能比彼此快,但是它们的实现可以.那是对的,我想我会同意的.
你不太可能注意到基准以外的其他差异.c ++流通常趋于缓慢的原因是它们更灵活.灵活性通常以时间或代码增长为代价.
在这种情况下,C++流基于流缓冲区.流本身只是保持格式化和错误标志的船体,并调用i/o
c ++标准库的正确方面(例如,num_put打印数字),将格式良好的值打印到底层流中 -连接到c ++流的缓冲区.
所有这些机制 - 方面和缓冲区都是由虚函数实现的.虽然确实没有标记注释,但这些函数必须实现为比c stdio吊坠慢,事实上它们会比通常使用c stdio函数慢一些(我在一段时间之前使用gcc/libstdc ++进行基准测试,实际上已经注意到了减速 - 但你在日常使用中几乎没有注意到).