C vs C性能(用于处理短字符串)
编辑
我的测试结果是here.虽然有人坚持我的测试是完全错误的,但C比C慢110%;( 最近,Bjarne Stroustrup写了Five Popular Myths about C++ 在他的文章中,他用C和C实现了一个函数 C版 string compose(const string& name,const string& domain) { return name+'@'+domain; } C版 char* compose(const char* name,const char* domain) { char* res = malloc(strlen(name)+strlen(domain)+2); // space for strings,'@',and 0 char* p = strcpy(res,name); p += strlen(name); *p = '@'; strcpy(p+1,domain); return res; } 最后他提到:
这是正确的吗?虽然C版本比C版本短,但我认为std :: string的operator()类似于C版本. 解决方法
至少在某些情况下,是的,C版本将大大加快.
特别是,std :: string的一些实现包括通常被称为“短字符串优化”(又名“SSO”)的内容.这样,std :: string对象本身就包含一个字符串的空间,该字符串达到某个特定限制(通常约为20个字符).适合该缓冲区的字符串可以(并且将)避免在堆/空闲存储上分配空间来存储其数据. 从理论上讲,你可以做大致相同的事情C – 但是如果你这样做,你必须定义自己的结构来保存你的字符串(就像C一样),并且操作这些字符串结构的每一段代码都需要知道它们是如何工作的,并以同样的方式操纵它们. C可以很容易地将代码包装到运算符重载中,以隐藏细节. 最重要的是,C理论上可以跟上,但是要做到这一点就足够了,实际上需要在C中进行这种操作的程序几乎总是比用C语言编写的对应程序更快.不同的是它们运行的??速度有多快 – 有时候它们只会快一点,但特别是在对相对较小的字符串进行大量操作的情况下,相当大的差异(例如,2:1或更多)非常常见.当你需要操作非常大的字符串时,差异也可能非常大,其中C通过能够在恒定时间内找到大小来获得很多,其中strlen需要线性时间.对于小到足以完全适合L1缓存的字符串,这并不意味着什么,但如果您可以从L1读取一个值而从主存储器读取整个字符串,则差异可能很大. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |