最快捷的词汇方式

6 c++ boost stdstring

使用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工作,我想尝试一下.

谢谢.

Dan*_*ani 5

几种使速度更快的方法:
1.不要使用to_lower,它很慢。也不要使用ifs,而是创建一个包含256个条目的表,该条目将字符映射到其小写版本,而另一个表则使用大写形式。
2.不要使用transform,将指针指向第一个字符并循环直到空终止符。
3.如果内存不是问题,请使用映射2个字符序列的表。在这种情况下,您将需要另一个处理终止的表。
4.如果可以在组装中执行此操作,它将更快。

  • 您是否有证据支持其中任何一个?例如,通常将std :: transform完全内联。 (6认同)
  • 不要以为这只是世界上的拉丁字母! (3认同)

Adv*_*sus 5

在处理输入不能保证为大写的 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)


ink*_*boo 2

如果大写确实是一个瓶颈,那么使用手写循环和内联 toupper/tolower 函数编写自己的大写实现。如果有必要,请使用 ASM。