[原创]指针和函数效率比较
读取一个文本的词典(未序列化),比较了一下C++中函数和指针(C)的效率:平台:AS3.0
环境:GCC3.2.3
功能:
1,文本开始第1列为汉字,第2列、第3列...第n列为其他属性;
2,要求将文本hash化,并将2-n列装入一个vector容器中,其key为汉字或其内码;
C++函数代码片段如下:[code] unsigned short utf16[0];
unsigned short len = charUtf8ToUtf16(line.c_str(), utf16);
size_t tabpos = line.find('\t');
if (tabpos != string::npos)
{
word = line.substr(0, tabpos);
if (!word.empty())
{
vector<string> vect;
string tmp;
size_t pos = word.size() + 1;
size_t loc = word.size() + 1;
while ((pos = line.find(' ', pos)) != string::npos)
{
tmp = line.substr(loc, pos - loc - 1);
if (!tmp.empty()) vect.push_back(tmp);
pos += 1;
loc = pos;
}
tmp = line.substr(loc, line.length() - loc - 1);
if (!tmp.empty()) vect.push_back(tmp);
}
}[/code]所消耗时间为:88ms-90ms左右
指针代码片段如下:[code] char* p = (char *)line.c_str();
unsigned short utf16[0];
unsigned short len = charUtf8ToUtf16(p, utf16);
vector<string> vect;
char pp[6][7];
int offset = 0;
int i = 0;
int j = 0;
string tmp;
while (*p != 0)
{
if (offset == 1)
{
if (*(p + 2) == ' ' || *(p + 2) == 0 || *(p + 1) == 0)
{
pp[i][j] = 0;
tmp = string(pp[i]);
if (!tmp.empty()) vect.push_back(tmp);
j = 0;
i ++;
p ++;
}
else
{
pp[i][j] = *(p + 1);
j ++;
}
}
if (*p == '\t')
{
pp[0][0] = *(p + 1);
j ++;
offset += 1;
}
p ++;
}[/code]所消耗时间为:76ms-78ms左右,应该还可以进行优化;
结论:看样子指针这东西的确好,不仅仅效率非常高,而且在 C 语言里面只要弄懂了指针,也就弄懂了 C 语言的数据结构哟! 指针好,引用更好
指针用得不好,那就相当得不爽,轻则内存泄露,重则系统崩溃。 :) C更注重效率,所以系统级的程序都是用C开发的,C++更注重开发效率,所以大型应用程序基本都是用C++做的,这种比较没啥意义。不存在谁好谁更好的说法,不同的环境用不同的工具。 :Q 注意,我是在比较细节,都是C++,而不是C和C++比较, 我只是说用指针比用某个类或者库方法更快一些 某个类或者库方法实现这种功能也是通过指针操作实现的啊,不明白
至于类,是为了模块化,方便程序的设计而已,指针和引用就像操作符+-*/一样使用的频繁。
angle是想比较调用string对象实现特定功能和自己实现同一功能这两者之间的效率差别吧,这相差的10ms我估计是while循环里频繁调用line.find(...)时的跳转语句和堆栈保存恢复以及临时变量的拷贝给占去了。
就特定的例子而言,这样的比较结论用处不大,而且,指针和函数没有什么可比性,不是一层面的。
要说比较普通函数和内联函数、虚函数之间,那才有的比。 结论就是,之所以前一段程序比后一段慢,主要在于前一段程序的while循环里频繁的调用了line.find(' ', pos),line.substr(loc, pos - loc - 1);这两句话,函数调用要对现场进行保存,乱七八糟的寄存器都要先push进堆栈,然后跳转到line.find(),line.substr()的函数地址去执行,还要对这两个函数的实参进行传值拷贝,等这两个函数执行完了,又得恢复现场,将先前保存的寄存器的值pop出堆栈,然后继续执行这两个函数后面的语句。cpu时间都耗在这里了,被处理的文本的n值(列数)越大,这种效率的差别体现得越明显。
编译出汇编代码看看,应该可以验证。时间耗在了函数调用这一环节。 比较一下函数、内联函数、和宏吧,很想看看这方面的结论
页:
[1]