我的测试结果是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;}
最后他提到:
which version is likely to be the most efficIEnt? Yes,the C++ version,because it does not have to count the argument characters and does not use the free store (dynamic memory) for short argument strings.
这是正确的吗?虽然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读取一个值而从主存储器读取整个字符串,则差异可能很大.
总结以上是内存溢出为你收集整理的C vs C性能(用于处理短字符串)全部内容,希望文章能够帮你解决C vs C性能(用于处理短字符串)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)