繁体   English   中英

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

[英]Is a std::vector lookup faster than performing a simple operation?

我正在尝试优化一些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的加速。

关于唯一可能的答案是“可能” - 您可以通过运行分析器或其他东西来查找代码的时间。 有一段时间,如果答案很少或没有资格,那么很容易给出“是”。 现在,由于速度更快的CPU是如何比内存得到,这是少了很多肯定的-你可以做很多计算的需要,填补从主内存中的一个缓存行的时间。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM