关于strlen效率的问题

Joker____ 2011-12-12 10:01:07
在D:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src目录下
找到了strlen.h的实现代码

size_t __cdecl strlen (
const char * str
)
{
const char *eos = str;

while( *eos++ ) ;

return( eos - str - 1 );
}

自己下了个GNU的源代码 找到了里面的strlen函数的代码

当我把这两份代码复制粘贴进入我自己创建的工程里面进行测试的时候 msvc_strlen(MSVC)确实比 gnu_strlen(GNU)要慢

但是两个都比直接调用strlen要慢得多 请问这个是什么原因造成的
PS:在release下测试仍然是这样。。。
...全文
535 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-12-13
  • 打赏
  • 举报
回复
参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strlen.asm

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮
Joker____ 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengzhixi 的回复:]

像这些函数一般都是用内嵌汇编版本。c版本只是给人看的。
[/Quote]

那vc\crt\src里面的那些.c文件基本上或者说全都是用来给我们理解函数的逻辑的 并不是它的实现咯?同理GNU的代码也是那样?
Joker____ 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhangsongcui 的回复:]

引用楼主 joker____ 的回复:
但是两个都比直接调用strlen要慢得多

LZ怎样写的?strlen("asdf")这样?
看一下反汇编,是不是在编译期就替换了?
[/Quote]


__int64 testFunc()
{
long long i = 1000000000;
char s[] = "This is my life!";
long long length = 0;
while(i--)
length += gnu_strlen(s);
return length;
}


因为好像不累加 直接gnu_strlen 估计是没有影响到程序 直接给优化掉了。。。
反汇编我怎么没看到这个的反汇编 都是别的。。。没gnu_strlen 难道是自动内联了啊。。。

pengzhixi 2011-12-13
  • 打赏
  • 举报
回复
像这些函数一般都是用内嵌汇编版本。c版本只是给人看的。
Joker____ 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 keiy 的回复:]

你是命令行还是在IDE中
命令行的直接加-O2
IDE中在项目属性中有的,首先是配制(release或debug),然后是在配制属性的C/C++中,有关优化的选择
[/Quote]

刚刚看了下 默认是不使用优化 我把它改成了-O2 速度最大 结果和直接调用strlen相比还是差很多。。。这么看默认就是使用的strlen汇编版本咯?
zhangsongcui 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 joker____ 的回复:]
但是两个都比直接调用strlen要慢得多
[/Quote]
LZ怎样写的?strlen("asdf")这样?
看一下反汇编,是不是在编译期就替换了?
Joker____ 2011-12-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhao4zhong1 的回复:]

参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strlen.asm

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Selec……
[/Quote]

嗯 我已经看过那个文件了。那\Microsoft Visual Studio 10.0\VC\crt\src 下面的.C文件都是表述汇编代码的逻辑用的?实际上根本不会用到那些么?
柯本 2011-12-12
  • 打赏
  • 举报
回复
你是命令行还是在IDE中
命令行的直接加-O2
IDE中在项目属性中有的,首先是配制(release或debug),然后是在配制属性的C/C++中,有关优化的选择

Joker____ 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 keiy 的回复:]

这个要看编译器,如VC的,一般release模式加-O2或-Ox 可能会调用汇编版本
[/Quote]

囧 虽然我知道优化级别这种东西 可是我现在用VS2010 能告诉我在哪设置这个么。。。
柯本 2011-12-12
  • 打赏
  • 举报
回复
这个要看编译器,如VC的,一般release模式加-O2或-Ox 可能会调用汇编版本
Joker____ 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 keiy 的回复:]

一般编译器中,很都会有两套库函库,一套是用标准的C写的,一套是用汇编写的
用标准的C写的,通用性好,便于移植,但效率低
用汇编写的,效率高.但移植性差(如linux的gcc与windows VS的汇编程式是不同的)
对于strlen,当然是用汇编写的效率好些(记得以前讨论过类似的),看上去,汇编代码要长很多,但它用了效率优化(如一次操作4个字节,对32位CPU来说,效率要比4次操作1个字节……
[/Quote]

那我直接调用的strlen就是汇编版本的么?一般什么时候才会用到C版本的库函数呢
iamnobody 2011-12-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110826/08/3a6b0dff-2850-433c-a002-9f3795a7a1f1.html

给楼主找了个这个。。看看吧C语言版的,效率与自带的strlen相等的,。
柯本 2011-12-12
  • 打赏
  • 举报
回复
一般编译器中,很都会有两套库函库,一套是用标准的C写的,一套是用汇编写的
用标准的C写的,通用性好,便于移植,但效率低
用汇编写的,效率高.但移植性差(如linux的gcc与windows VS的汇编程式是不同的)
对于strlen,当然是用汇编写的效率好些(记得以前讨论过类似的),看上去,汇编代码要长很多,但它用了效率优化(如一次操作4个字节,对32位CPU来说,效率要比4次操作1个字节效率高很多)
昵称很不好取 2011-12-12
  • 打赏
  • 举报
回复
给楼主找了篇文章,有空可以看看
http://blog.csdn.net/masefee/article/details/7040012

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧