【发布时间】:2012-05-28 03:57:26
【问题描述】:
使用 C++ 将单词 (std::string) 大写的最快方法是什么?
在使用带有 -O3 标志的 g++ 4.6.3 的 Debian Linux 上,这个使用 boost::to_lower 的函数将在 AMD Phenom(tm) II X6 1090T 处理器 (3200兆赫)。
void Capitalize( std::string& word )
{
boost::to_lower( word );
word[0] = toupper( word[0] );
}
这个使用std::transform 的函数在大约10 秒内完成同样的事情。我在测试之间清除了虚拟机,所以我不认为这种差异是侥幸:
sync && echo 3 > /proc/sys/vm/drop_caches
void Capitalize( std::string& word )
{
std::transform(word.begin(), word.end(), word.begin(), ::tolower);
word[0] = toupper( word[0] );
}
有更快的方法吗?我不想为了速度而失去可移植性,但是如果有更快的方法可以在 std C++ 或带有 boost 的 std C++ 中工作,我想尝试一下。
谢谢。
【问题讨论】:
-
资本化真的是瓶颈吗?
-
要优化,您必须分析代码以确定瓶颈。一旦你知道瓶颈是什么,你就可以设计一个更快的解决方案。另外,您是否比较了两种解决方案的结果,以便知道它们是否真的做同样的事情?或许 boost 适用于 UTF-8 或提供更好的语言环境和 Unicode 支持(反之亦然)。
-
作为 std::transform 的一个小优化,您可以从 word.begin() + 1 开始,这样您就不会在您要去的第一个字符上调用
tolower发送至toupper。 -
数据从何而来?如果您是从磁盘读取,那么 IO 很可能会成为您的瓶颈。
-
@OliCharlesworth - 是的,这些词来自磁盘上的文件。我意识到 IO 在某些时候可能会是缓慢的部分。我想我还没有达到目标。