考虑下面两个语义上等价的程序一个使用C 风格字符串另一个使用string 类型
// ***** C-style character string implementation *****
#include <iostream>
#include <cstring>
int main()
{
int errors = 0;
const char *pc = "a very long literal string";
for ( int ix = 0; ix < 1000000; ++ix )
{
int len = strlen( pc );
char *pc2 = new char[ len + 1 ];
strcpy( pc2, pc );
if ( strcmp( pc2, pc ))
++errors;
delete [] pc2;
}
cout << "C-style character strings: "
<< errors << " errors occurred.\n";
}
// ***** string implementation *****
#include <iostream>
#include <string>
int main() {
int errors = 0;
string str( "a very long literal string" );
for ( int ix = 0; ix < 1000000; ++ix )
{
int len = str.size();
string str2 = str;
if ( str != str2 )
++errors;
}
cout << "string class: "
<< errors << " errors occurred.\n";
}
他说,平均来说string 类型实现的执行速度是C 风格字符串的两倍。
在UNIX 的timex命令下显示的执行时间如下
user 0.96 # string class user
user 1.98 # C-style character string
请教这是为什么?
10 个解决方案
#1
int len = strlen( pc );
靠,每次都GETSIZE,都没有修改还要GET效率当然下降,人家STRING没有修改SIZE是固定的,本来就不是公平的比赛!
一般来说都是C-STYLE比较块
靠,每次都GETSIZE,都没有修改还要GET效率当然下降,人家STRING没有修改SIZE是固定的,本来就不是公平的比赛!
一般来说都是C-STYLE比较块
#2
string str2 = str;
还有创建一个STR2复制给它STR
如果没有修改STR2
STRING里面有一种技术叫延世复制
如果不修改就不用复制
知道要修改了才修改,所以更本没有复制的开销又没有反复求长的开销
当然快到家
还有创建一个STR2复制给它STR
如果没有修改STR2
STRING里面有一种技术叫延世复制
如果不修改就不用复制
知道要修改了才修改,所以更本没有复制的开销又没有反复求长的开销
当然快到家
#3
char *pc2 = new char[ len + 1 ];
delete [] pc2;
类似这样的代码在循环中是禁忌的。
string和C style的字符串比较效率是没有意义的,他们各有个的特点。
string的内部还是用C style的字符串实现的,应该说string是对C Stryle的字符串的封装。
strcpy( pc2, pc );是要比string str2 = str;慢一些,因为string内部保存了字符串的长度
如果知道pc的长度,还是可以通过memcpy(pc2, pc, sizeof(char) * length)获得和
string::operator=同样的效率。
delete [] pc2;
类似这样的代码在循环中是禁忌的。
string和C style的字符串比较效率是没有意义的,他们各有个的特点。
string的内部还是用C style的字符串实现的,应该说string是对C Stryle的字符串的封装。
strcpy( pc2, pc );是要比string str2 = str;慢一些,因为string内部保存了字符串的长度
如果知道pc的长度,还是可以通过memcpy(pc2, pc, sizeof(char) * length)获得和
string::operator=同样的效率。
#4
TO:xiaolizi(小李子)
可以说STRCPY比STRING的复制要快,看了标准库的实现发现是用ASM实现的远比它快
而且就算是一般的算法相差也不到几个CPU周期
主要就是内存根本没有复制
可以说STRCPY比STRING的复制要快,看了标准库的实现发现是用ASM实现的远比它快
而且就算是一般的算法相差也不到几个CPU周期
主要就是内存根本没有复制
#5
有关string的延迟复制和引用技术,这些东东在MS的开发库中都没有用到。
我个人觉得延迟复制和引用技术本身就给string来了复杂度,而意义并不是很明显,
熟练的c++程序员完全可以通过自己的经验获得更好的效率。
#6
To Kenmark(fenix)
"可以说STRCPY比STRING的复制要快",
我不认为是这样子的,兄弟如果去看看MS的库中的string有关assign的源代码,你会发现它是用memcpy的,而memcpy肯定要比strcpy来的快。
"可以说STRCPY比STRING的复制要快",
我不认为是这样子的,兄弟如果去看看MS的库中的string有关assign的源代码,你会发现它是用memcpy的,而memcpy肯定要比strcpy来的快。
#7
但是的确在本例里面有了很大的影响!
完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了,只要不写一些实在效率太低下得代码,就可以了,
完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了,只要不写一些实在效率太低下得代码,就可以了,
#8
memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言,
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言,
#9
To Kenmark(fenix)
"完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了"
兄弟,你这么说可就不敢认同啦,如果string没有效率或者string是给偷懒的人用的话,我想
c++标准委员会老早就把string给踢出标准库了。
现在很多的程序员一直在叫嚣着说某某库某某类低效率或者用起来不方便,殊不知编程就像学武功,每一个境界都有不同的认识,等到了一定的层次就不会被这些表象所迷惑,就好比武学修为到了张三丰的境界,手中拿小树枝和拿倚天剑是没多大区别的。string还是C Style的字符串,这个应该根据不同的场合来决定使用。
“memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言”
这个就更不敢认同啦,c/c++本身就是机器层的编程语言,效率始终是第一考虑的条件,要不c/c++干吗不去搞动态语言啊,要不怎么区别c/c++和java和c#啊。
memcpy比strcpy快,是在算法逻辑层就决定了的,并不是因为memcpy用了汇编,如果看MS的库中的strcpy的源码,会发现strcpy也是用汇编的。
"完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了"
兄弟,你这么说可就不敢认同啦,如果string没有效率或者string是给偷懒的人用的话,我想
c++标准委员会老早就把string给踢出标准库了。
现在很多的程序员一直在叫嚣着说某某库某某类低效率或者用起来不方便,殊不知编程就像学武功,每一个境界都有不同的认识,等到了一定的层次就不会被这些表象所迷惑,就好比武学修为到了张三丰的境界,手中拿小树枝和拿倚天剑是没多大区别的。string还是C Style的字符串,这个应该根据不同的场合来决定使用。
“memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言”
这个就更不敢认同啦,c/c++本身就是机器层的编程语言,效率始终是第一考虑的条件,要不c/c++干吗不去搞动态语言啊,要不怎么区别c/c++和java和c#啊。
memcpy比strcpy快,是在算法逻辑层就决定了的,并不是因为memcpy用了汇编,如果看MS的库中的strcpy的源码,会发现strcpy也是用汇编的。
#10
还是要mark!
#1
int len = strlen( pc );
靠,每次都GETSIZE,都没有修改还要GET效率当然下降,人家STRING没有修改SIZE是固定的,本来就不是公平的比赛!
一般来说都是C-STYLE比较块
靠,每次都GETSIZE,都没有修改还要GET效率当然下降,人家STRING没有修改SIZE是固定的,本来就不是公平的比赛!
一般来说都是C-STYLE比较块
#2
string str2 = str;
还有创建一个STR2复制给它STR
如果没有修改STR2
STRING里面有一种技术叫延世复制
如果不修改就不用复制
知道要修改了才修改,所以更本没有复制的开销又没有反复求长的开销
当然快到家
还有创建一个STR2复制给它STR
如果没有修改STR2
STRING里面有一种技术叫延世复制
如果不修改就不用复制
知道要修改了才修改,所以更本没有复制的开销又没有反复求长的开销
当然快到家
#3
char *pc2 = new char[ len + 1 ];
delete [] pc2;
类似这样的代码在循环中是禁忌的。
string和C style的字符串比较效率是没有意义的,他们各有个的特点。
string的内部还是用C style的字符串实现的,应该说string是对C Stryle的字符串的封装。
strcpy( pc2, pc );是要比string str2 = str;慢一些,因为string内部保存了字符串的长度
如果知道pc的长度,还是可以通过memcpy(pc2, pc, sizeof(char) * length)获得和
string::operator=同样的效率。
delete [] pc2;
类似这样的代码在循环中是禁忌的。
string和C style的字符串比较效率是没有意义的,他们各有个的特点。
string的内部还是用C style的字符串实现的,应该说string是对C Stryle的字符串的封装。
strcpy( pc2, pc );是要比string str2 = str;慢一些,因为string内部保存了字符串的长度
如果知道pc的长度,还是可以通过memcpy(pc2, pc, sizeof(char) * length)获得和
string::operator=同样的效率。
#4
TO:xiaolizi(小李子)
可以说STRCPY比STRING的复制要快,看了标准库的实现发现是用ASM实现的远比它快
而且就算是一般的算法相差也不到几个CPU周期
主要就是内存根本没有复制
可以说STRCPY比STRING的复制要快,看了标准库的实现发现是用ASM实现的远比它快
而且就算是一般的算法相差也不到几个CPU周期
主要就是内存根本没有复制
#5
有关string的延迟复制和引用技术,这些东东在MS的开发库中都没有用到。
我个人觉得延迟复制和引用技术本身就给string来了复杂度,而意义并不是很明显,
熟练的c++程序员完全可以通过自己的经验获得更好的效率。
#6
To Kenmark(fenix)
"可以说STRCPY比STRING的复制要快",
我不认为是这样子的,兄弟如果去看看MS的库中的string有关assign的源代码,你会发现它是用memcpy的,而memcpy肯定要比strcpy来的快。
"可以说STRCPY比STRING的复制要快",
我不认为是这样子的,兄弟如果去看看MS的库中的string有关assign的源代码,你会发现它是用memcpy的,而memcpy肯定要比strcpy来的快。
#7
但是的确在本例里面有了很大的影响!
完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了,只要不写一些实在效率太低下得代码,就可以了,
完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了,只要不写一些实在效率太低下得代码,就可以了,
#8
memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言,
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言,
#9
To Kenmark(fenix)
"完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了"
兄弟,你这么说可就不敢认同啦,如果string没有效率或者string是给偷懒的人用的话,我想
c++标准委员会老早就把string给踢出标准库了。
现在很多的程序员一直在叫嚣着说某某库某某类低效率或者用起来不方便,殊不知编程就像学武功,每一个境界都有不同的认识,等到了一定的层次就不会被这些表象所迷惑,就好比武学修为到了张三丰的境界,手中拿小树枝和拿倚天剑是没多大区别的。string还是C Style的字符串,这个应该根据不同的场合来决定使用。
“memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言”
这个就更不敢认同啦,c/c++本身就是机器层的编程语言,效率始终是第一考虑的条件,要不c/c++干吗不去搞动态语言啊,要不怎么区别c/c++和java和c#啊。
memcpy比strcpy快,是在算法逻辑层就决定了的,并不是因为memcpy用了汇编,如果看MS的库中的strcpy的源码,会发现strcpy也是用汇编的。
"完全追求效率而放弃通用和偷懒的人最终会死得很惨,所以有时用用STRING这些低效得东西,睁一只眼闭一只眼就算了"
兄弟,你这么说可就不敢认同啦,如果string没有效率或者string是给偷懒的人用的话,我想
c++标准委员会老早就把string给踢出标准库了。
现在很多的程序员一直在叫嚣着说某某库某某类低效率或者用起来不方便,殊不知编程就像学武功,每一个境界都有不同的认识,等到了一定的层次就不会被这些表象所迷惑,就好比武学修为到了张三丰的境界,手中拿小树枝和拿倚天剑是没多大区别的。string还是C Style的字符串,这个应该根据不同的场合来决定使用。
“memcpy的确比strcpy快(一点点)
但是那个只是MS库里面得情况,标准库希望不要多用汇编而是使用语言”
这个就更不敢认同啦,c/c++本身就是机器层的编程语言,效率始终是第一考虑的条件,要不c/c++干吗不去搞动态语言啊,要不怎么区别c/c++和java和c#啊。
memcpy比strcpy快,是在算法逻辑层就决定了的,并不是因为memcpy用了汇编,如果看MS的库中的strcpy的源码,会发现strcpy也是用汇编的。
#10
还是要mark!