Efficiency
- From: KJH <k_jh77@xxxxxxxxx>
- Date: Fri, 26 Oct 2007 09:49:20 -0700
Let's say I want to write compact and fast code.
I'm thinking about something like this:
; proc returns ZF set if char is 'a' or 'z'
myproc proc
cmp al,'a'
je @@1
cmp al,'z'
@@1: ret
myproc endp
compared to C version:
int myfunc(int c)
{
if (c == 'a' || c == 'z')
return 1;
return 0;
}
What is the penalty? Okay, these are very basic and small routines,
but I guess that modern C compilers are more aware about optimal
alignment and also it seems that modern Pentiums and above really like
their instructions more RISC-like (aka boring instr set).
I am used to instructions like lodsb, stosb, inc, dec etc... I'm
adapted to that kind of mental image, lodsb for example in my mind is
a very convenient instruction to load a byte from memory pointed by
DS:ESI. I can visualize it. Also loop instruction is nice, it's
compact (in a conceptual way), but I don't know...
Why is it so that nowadays:
mov eax,[esi]
mov [edi],eax
is more efficient than
lodsd
stosd
?
I just don't get it.
But to my actual question, is it likely that I'm going to take a speed
hit or cache misses by using these old asm constructs vs. more modern
C-like constructs? Code compactness doesn't necessarily translate to
speed, no?
Hopefully somebody can make some sense what I'm talking about, I'm not
sure if I express myself clearly :)
.
- Follow-Ups:
- Re: Efficiency
- From: Wolfgang Kern
- Re: Efficiency
- From: Rod Pemberton
- Re: Efficiency
- From: Dirk Wolfgang Glomp
- Re: Efficiency
- Prev by Date: Re: Skybuck's Wolfram (Turing-Like) Machine implementation
- Next by Date: Re: Efficiency
- Previous by thread: Re: Skybuck's Wolfram (Turing-Like) Machine implementation
- Next by thread: Re: Efficiency
- Index(es):
Relevant Pages
|