我在某个地方读到,snprintf比ostringstream更快。有人有过任何相关经验吗?如果有的话,为什么它会更快。
我在某个地方读到,snprintf比ostringstream更快。有人有过任何相关经验吗?如果有的话,为什么它会更快。
std::ostringstream
不一定比其它方法慢,但通常实现时较慢。 FastFormat网站提供了一些基准测试数据。
标准库的流设计支持的功能远远超过snprintf
。该设计旨在可扩展,并包括受到公开显示的方法调用的protected
virtual
方法。这使您可以从其中一个流类派生,确保如果您重载protect
ed方法,将获得所需的行为。我相信编译器可以避免virtual
函数调用的开销,但我不知道有哪些编译器会这样做。
此外,流操作经常在内部使用可增长缓冲区;这意味着相对较慢的内存分配。
我们在内部循环中使用静态分配的缓冲区以及sprintf(而不是stringstream)来替换一些字符串流,这在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 }
但我非常满意字符串流的整体性能。
当然,这是与实现相关的。
但如果你真的想知道,可以编写两个小程序并进行比较。你需要包含你所想要的典型用法,两个程序需要生成相同的字符串,然后使用分析器查看时间信息。
这样你就会知道了。
一个问题可能是由 ostringstream
添加的类型安全性会带来额外的开销。虽然我没有进行任何度量。
void Hex32Bit(unsigned int n, string &result)
{
#if 0
stringstream ss;
ss
<< hex
<< setfill('0')
<< "0x" << setw(8) << n
;
result = ss.str();
#else
const size_t len = 11;
char temp[len];
_snprintf(temp, len, "0x%08x", n);
temp[len - 1] = '\0';
result = temp;
#endif
}
void Hexx32Bit(...) {}
。 - Eric很可能是因为 sprintf
是由汇编语言编写的 CRT 的一部分。而 ostringstream
则是 STL 的一部分,可能更通用,并且需要处理面向对象的代码/开销。
sprintf
。早在UNIX V6时代,C运行时库就已经是用C语言编写的(除了一些不可能用C语言编写的极少数东西,比如setjmp
)。 - zwol我知道 printf 函数族比相应的 C++ 函数(cout、cin 和其他流)更快的一个原因是后者进行类型检查。由于这通常涉及一些对重载运算符的请求,因此可能需要一些时间。
事实上,在编程竞赛中,通常建议您使用 printf 等函数,而不是 cout/cin,正是出于这个原因。
<iostream>
很糟糕。 - Tom
printf
函数族支持本地化,就像iostream
一样。@kotlinski:它们也是线程安全的。 - user79758