std :: vector查找比执行简单操作更快吗?

时间:2011-04-26 23:24:39

标签: c++

我正在尝试优化某些C ++代码以提高速度,而不是关心内存使用情况。如果我有一些功能,例如,告诉我一个字符是否是一个字母:

bool letterQ ( char letter ) {
    return (lchar>=65 && lchar<=90) ||
       (lchar>=97 && lchar<=122);
}

创建查找表会更快,即

int lookupTable[128];
for (i = 0 ; i < 128 ; i++) {
    lookupTable[i] = // some int value that tells what it is
}

然后将上面的letterQ函数修改为

bool letterQ ( char letter ) {
    return lookupTable[letter]==LETTER_VALUE;
}

我正在尝试优化这个简单区域的速度,因为这些函数被大量调用,所以即使速度的小幅增加也会累积到长期增益中。

编辑:

我做了一些测试,如果查找数组被缓存,它似乎比查找函数表现得更好。我通过尝试

测试了这个
for (int i = 0 ; i < size ; i++) {
      if ( lookupfunction( text[i] ) )
      // do something
}

针对

bool lookuptable[128];
for (int i = 0 ; i < 128 ; i++) {
    lookuptable[i] = lookupfunction( (char)i );
}

for (int i = 0 ; i < size ; i++) {
    if (lookuptable[(int)text[i]])
        // do something
}

事实证明,第二个速度要快得多 - 大约是3:1的加速。

3 个答案:

答案 0 :(得分:7)

关于唯一可能的答案是“可能” - 您可以通过运行分析器或其他东西来查找代码的时间。有一段时间,如果答案很少或没有资格,那么很容易给出“是”。现在,考虑到CPU的内存速度比内存快多少, lot 不太确定 - 你可以在填充一个缓存行所需的时间内进行批次计算来自主记忆。

编辑:我应该在C或C ++中添加它,最好至少从标准库中内置的函数(或宏)开始。这些通常相当针对目标进行了仔细优化,并且(更重要的是对大多数人来说)支持诸如切换区域设置等内容,因此您不会试图向您的德国用户解释“ß'onn' t 真的一封信(我怀疑很多人会觉得很有趣“但那真是两个字母,而不是一个!)

答案 1 :(得分:1)

首先,我假设你已经对代码进行了分析并验证了这个特定函数在程序运行时间内消耗了大量的CPU时间?

我不会创建一个向量,因为你正在处理一个非常固定的数据大小。实际上,您可以创建一个常规的C ++数组,并在程序启动时进行初始化。使用支持数组初始化程序的真正现代编译器,您甚至可以执行以下操作:

bool lookUpTable[128] = { false, false, false, ..., true, true, ... };

不可否认,我可能会编写一个小脚本来生成代码,而不是手动完成。

答案 2 :(得分:0)

对于这样的简单计算,内存访问(由查找表引起)将比每次执行计算更昂贵。