我正在尝试优化一些C++代码以提高速度,而不关心内存使用情况.如果我有一些功能,例如,告诉我一个字符是否是一个字母:
bool letterQ ( char letter ) {
return (lchar>=65 && lchar<=90) ||
(lchar>=97 && lchar<=122);
}
Run Code Online (Sandbox Code Playgroud)
是否可以更快地创建查找表,即
int lookupTable[128];
for (i = 0 ; i < 128 ; i++) {
lookupTable[i] = // some int value that tells what it is
}
Run Code Online (Sandbox Code Playgroud)
然后修改上面的letterQ函数
bool letterQ ( char letter ) {
return lookupTable[letter]==LETTER_VALUE;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试在这个简单的区域中优化速度,因为这些函数被大量调用,因此即使速度的小幅增加也会累积到长期增益中.
编辑:
我做了一些测试,如果查找数组被缓存,它似乎比查找函数表现得更好.我通过尝试测试了这个
for (int i = 0 ; i < size ; i++) {
if ( lookupfunction( text[i] ) )
// do something
}
Run Code Online (Sandbox Code Playgroud)
反对
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
}
Run Code Online (Sandbox Code Playgroud)
事实证明,第二个速度要快得多 - 大约是3:1的加速.
关于唯一可能的答案是"可能" - 您可以通过运行分析器或其他东西来查找代码的时间.有一段时间,如果答案很少或没有资格,那么很容易给出"是".现在,由于速度更快的CPU是如何比内存得到,这是一个很多不太确定的-你可以做很多计算的需要,填补从主内存中的一个缓存行的时间.
编辑:我应该在C或C++中添加它,最好至少从标准库中内置的函数(或宏)开始.这些通常是针对目标进行相当精心优化的(对于大多数人来说更为重要)支持切换区域设置等事项,因此您不会试图向您的德国用户解释'ß'不是真正的字母(而且我怀疑很多人会觉得很有趣"但那真的是两个字母,而不是一个!)