我在类成员函数中有以下代码:
int state = 0;
int code = static_cast<int>(letter_[i]);
if (isalnum(code)) {
state = testTable[state][0];
} else if (isspace(code)) {
state = testTable[state][2];
} else if (code == OPEN_TAG) {
state = testTable[state][3];
} else if (code == CLOSE_TAG) {
state = testTable[state][4];
} else {
state = testTable[state][1];
}
switch (state) {
case 1: // alphanumeric symbol was read
buffer[j] = letter_[i];
++j;
break;
case 2: // delimeter was read
j = 0;
// buffer.clear();
break;
}
但是,如果 state 是类成员变量而不是局部变量,性能会大幅下降(~ 5 倍)。我正在阅读有关访问局部变量和类成员的差异,但文本通常说它对性能的影响非常轻微。
如果有帮助:我正在使用带有 -O3 选项的 MinGW GCC 编译器。
最佳答案
我无法重现您的观察,使用 VS10 和 g++ 在 x86_64 上进行测试。本地变体稍微快一些,可能是由于 Alan Stokes 在他的评论中所描述的,但最多约 10%。您应该检查您的时间安排,尝试排除任何其他问题,最好是将您的所有代码减少到一个仍然显示此行为的非常简单的测试转换。
我认为我的测试用例与您的场景非常相似,至少像您描述的那样:
#include <iostream>
#include <boost/timer.hpp>
const int max_iter = 1<<31;
const int start_value = 65535;
struct UseMember
{
int member;
void foo()
{
for(int i=0; i<max_iter; ++i)
{
if(member%2)
member = 3*member+1;
else
member = member>>1;
}
std::cout << "Value=" << member << std::endl;
}
};
struct UseLocal
{
void foo()
{
int local = start_value;
for(int i=0; i<max_iter; ++i)
{
if((local%2)!=0) /* odd */
local = 3*local+1;
else /* even */
local = local>>1;
}
std::cout << "Value=" << local << std::endl;
}
};
int main(int argc, char* argv[])
{
/* First, test using member */
std::cout << "** Member Access" << std::endl;
{
UseMember bar;
bar.member = start_value;
boost::timer T;
bar.foo();
double e = T.elapsed();
std::cout << "Time taken: " << e << "s" << std::endl;
}
/* Then, test using local */
std::cout << "** Local Access" << std::endl;
{
UseLocal bar;
boost::timer T;
bar.foo();
double e = T.elapsed();
std::cout << "Time taken: " << e << "s" << std::endl;
}
return 0;
}
关于c++ - 访问本地和类成员变量之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8269874/