留给C高手的问题!

watercolo007 2003-09-26 10:26:56
/* A: memset */
static void tooSlowChar(char *s,char c,char n)
{
char counter ;
for(counter = 0 ; counter < n ; counter = counter + 1) {
s[counter] = c ;
}
}
/* B: memset */
static void normal(char *s,int c,int n)
{
int i ; // ==>
for(i = 0 ; i < n ; i++) {
s[i] = c ;
}
}
A运行时间: 1330 msec
B运行时间: 370 msec
为什么两者的速度差别这么大?
...全文
29 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
watercolo007 2003-09-27
  • 打赏
  • 举报
回复
查了一下资料,
movsx是先做符号扩展,再做数据传输。
mov只做数据传输。
我想这个情况引起效率上的差别吧!
MagicianZ 2003-09-26
  • 打赏
  • 举报
回复
我解释这个问题。看编译结果:
1、第一个函数编译后
tooSlowChar proc near
push bp
mov bp,sp
;
; {
; char counter ;
; for(counter = 0 ; counter < n ; counter = counter + 1) {
;
mov dl,0
jmp short @1@114
@1@58:
;
; s[counter] = c ;
;
mov al,dl
cbw
mov bx,word ptr [bp+4]
add bx,ax
mov al,byte ptr [bp+6]
mov byte ptr [bx],al
mov al,dl
inc al
mov dl,al
@1@114:
mov al,dl
cmp al,byte ptr [bp+8]
jl short @1@58
;
; }
; }
;
pop bp
ret
tooSlowChar endp

第二个函数编译后
normal proc near
push bp
mov bp,sp
push si
;
; {
; int i ; // ==>
; for(i = 0 ; i < n ; i++) {
;
xor si,si
jmp short @1@114
@1@58:
;
; s[i] = c ;
;
mov bx,word ptr [bp+4]
mov al,byte ptr [bp+6]
mov byte ptr [bx+si],al
inc si
@1@114:
cmp si,word ptr [bp+8]
jl short @1@58
;
; }
; }
;
pop si
pop bp
ret
normal endp

事情应该很清楚了,char型变量的处理比int型要复杂,同时,i++和counter=counter+1编译代码完全不同,从算法分析看这个差别主要就在add指令和inc指令的区别上,前者需要的时钟数比后者多4-5倍,从而,你的实验结果基本正确。
watercolo007 2003-09-26
  • 打赏
  • 举报
回复
to Jinhao:

你做过测试吗?我做过没有太大差别!请大家找证据!
Jinhao 2003-09-26
  • 打赏
  • 举报
回复
关键counter = counter + 1
counter +1 会创建一个临时对象
再把临时对象赋给 counter,所以用的时间就更多了
arfi 2003-09-26
  • 打赏
  • 举报
回复
听说int型的执行效率是最高的/
19830711 2003-09-26
  • 打赏
  • 举报
回复
i++的效率比counter = counter + 1 高
watercolo007 2003-09-26
  • 打赏
  • 举报
回复
在VC下

A:
movsx eax,byte ptr [ebp-4] <==
|__ 这两个语句有何差别呢?
B: |
mov eax,dword ptr [ebp-4] <==
watercolo007 2003-09-26
  • 打赏
  • 举报
回复
to MagicianZ:

你是用什么编译器?如果在VC6.0下编译结果怎么是一样的?难道VC编译器的处理方法不一样!难怪我在VC下看它的编译码看不出什么名堂!!!

你以上的分析还是很正确的!!!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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