使用 C++ 的 StringBuilder 提升 4350% 的性能(3)

在使用这段代码前, 考虑使用ostring流。正如你在下面看到Jeff先生评论的一样,它比这篇文章中的代码更快些。

你可能想使用这段代码,如果:

你正在编写由具有C#经验的程序员维护的代码,并且你想提供一个他们所熟悉接口的代码。

你正在编写将来会转换成.net的、你想指出一个可能路径的代码。

由于某些原因,你不想包含<sstream>。几年之后,一些流的IO实现变得很繁琐,而且现在的代码仍然不能完全摆脱他们的干扰。

要使用这段代码,只有按照main函数实现的那样就可以了:创建一个StringBuilder的实例,用Append()、AppendLine()和Add()给它赋值,然后调用ToString函数检索结果。

就像下面这样:

int main() {
 ////////////////////////////////////
 // 8-bit characters (ANSI)
 ////////////////////////////////////
 StringBuilder<char> ansi;
 ansi.Append("Hello").Append(" ").AppendLine("World");
 std::cout << ansi.ToString();

////////////////////////////////////
 // Wide characters (Unicode)
 ////////////////////////////////////
 //
 std::vector<std::wstring> cargoCult
 {
  L"A", L" cargo", L" cult", L" is", L" a", L" kind", L" of", L" Melanesian", L" millenarian", L" movement",
// many more lines here...
L" applied", L" retroactively", L" to", L" movements", L" in", L" a", L" much", L" earlier", L" era.\n"
 };
 StringBuilder<wchar_t> wide;
 wide.Add(cargoCult.begin(), cargoCult.end()).AppendLine();
        // use ToString(), just like .net
 std::wcout << wide.ToString() << std::endl;
 // Javascript-like join.
 std::wcout << wide.Join(L" _\n") << std::endl;

////////////////////////////////////
 // Performance tests
 ////////////////////////////////////
 TestPerformance(wide, cargoCult);
#ifdef __USE_POSIX199309
 AccurateTestPerformance(wide, cargoCult);
#endif // def __USE_POSIX199309
 return 0;
}

任何情况下,当连接超过几个字符串时,当心std::accumulate函数。

在稍等一下!

你可能会问:你是在试着说服我们提前优化吗?

不是的。我赞同提前优化是糟糕的。这种优化并不是提前的:是及时的。这是基于经验的优化:我发现自己过去一直在和这种特殊的怪胎搏斗。基于经验的优化(不在同一个地方摔倒两次)并不是提前优化。

当我们优化性能时,“惯犯”会包括磁盘I-O操作、网络访问(数据库、web服务)和内层循环;对于这些,我们应该添加内存分配和性能糟糕的Keyser Söze

鸣谢

首先,我要为这段代码在Linux系统上做的精准分析感谢Rutenberg。

多亏了Wikipedia,让“在指尖的信息”的梦想得以实现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8b351fbdde9adf5ed80148958d1c60f6.html