使用C++将单词(std :: string)大写的最快方法是什么?
在使用带有-O3标志的g ++ 4.6.3的Debian Linux上,使用此函数boost::to_lower将在AMD Phenom(tm)II X6 1090T处理器(3200 MHz)的单个执行线程中大约24秒内占用81,450,625个字.
void Capitalize( std::string& word )
{
boost::to_lower( word );
word[0] = toupper( word[0] );
}
Run Code Online (Sandbox Code Playgroud)
此功能使用std::transform大约10秒内完成相同的操作.我在测试之间清除VM,所以我不认为这种差异是侥幸:
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] );
}
Run Code Online (Sandbox Code Playgroud)
有更快的方法吗?我不想为了速度而失去可移植性,但是如果有更快的方法可以在std C++或std C++中使用boost工作,我想尝试一下.
谢谢.
几种使速度更快的方法:
1.不要使用to_lower,它很慢。也不要使用ifs,而是创建一个包含256个条目的表,该条目将字符映射到其小写版本,而另一个表则使用大写形式。
2.不要使用transform,将指针指向第一个字符并循环直到空终止符。
3.如果内存不是问题,请使用映射2个字符序列的表。在这种情况下,您将需要另一个处理终止的表。
4.如果可以在组装中执行此操作,它将更快。
在处理输入不能保证为大写的 DNA 序列时遇到了这个确切的问题,并且boost::to_upper代码中的瓶颈在哪里。改成这样:
template<typename T_it>
void SequenceToUpperCase( T_it begin, T_it end )
{
// Convert to upper: clear the '32' bit, 0x20 in hex. And with the
// inverted bit string (~).
for ( auto it = begin; it != end; ++it )
*it &= ~0x20;
}
Run Code Online (Sandbox Code Playgroud)
导致了巨大的速度提升。我确信可以通过例如一次翻转 8 个字节来进一步优化,但是使用上面的代码,大写字母对我们来说几乎是瞬时的。对于小写:做:
*it |= 0x20;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3242 次 |
| 最近记录: |