473,486 Members | 1,970 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Are system calls sometimes costlier than library calls?

Hi all,
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]

--prog 1--
#include<stdio.h>
#include<stdlib.h>

int main() {
printf("Hello"); /* up to here write() isn't called, if u
* give \n here then two write()s will
* be called (?)*/
printf("World\n");
return 0;
}

--end--

--prog2--
#include<unistd.h>

int main() {
write(1, "Hello", 5);
write(1, "world\n", 6);
return 0;
}

--end--

If u see the output of strace for prog1

--truncated--
....
munmap(0xb7fa0000, 115973) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7fbc000
write(1, "HelloWorld\n", 11) = 11
exit_group(0) = ?

-- end --

Its only making ONE write() system call

for prog2 if u see strace
--truncated--
....
mprotect(0xb7f50000, 4096, PROT_READ) = 0
munmap(0xb7f56000, 115973) = 0
write(1, "Hello", 5) = 5
write(1, "world\n", 6) = 6
exit_group(0) = ?

--end--

Its making TWO syscalls.

Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think. Why is that? Who is telling our
program to combine to calls to printf() in a single wrtie() ? Is it
the libc?

Its certainly not compiler optimization as I compiled it with -O0
option.

Thanks
Omkar.

Nov 6 '07 #1
21 2422
In article <11**********************@e9g2000prf.googlegroups. com>,
omkar pangarkar <om*********@gmail.comwrote:
>Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think. Why is that? Who is telling our
program to combine to calls to printf() in a single wrtie() ? Is it
the libc?
I suggest you read about setbuf()
--
"Beware of bugs in the above code; I have only proved it correct,
not tried it." -- Donald Knuth
Nov 6 '07 #2
On Wednesday 07 Nov 2007 1:56 am omkar pangarkar <om*********@gmail.com>
wrote in article
<11**********************@e9g2000prf.googlegroups. com>:
Hi all,
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]

--prog 1--
#include<stdio.h>
#include<stdlib.h>

int main() {
printf("Hello"); /* up to here write() isn't called, if u
* give \n here then two write()s will
* be called (?)*/
printf("World\n");
return 0;
}

--end--

--prog2--
#include<unistd.h>

int main() {
write(1, "Hello", 5);
write(1, "world\n", 6);
return 0;
}

--end--

If u see the output of strace for prog1

--truncated--
...
munmap(0xb7fa0000, 115973) = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7fbc000
write(1, "HelloWorld\n", 11) = 11
exit_group(0) = ?

-- end --

Its only making ONE write() system call

for prog2 if u see strace
--truncated--
...
mprotect(0xb7f50000, 4096, PROT_READ) = 0
munmap(0xb7f56000, 115973) = 0
write(1, "Hello", 5) = 5
write(1, "world\n", 6) = 6
exit_group(0) = ?

--end--

Its making TWO syscalls.

Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think.
Why are you worried about microoptimisation like these?
Why is that? Who is telling our
program to combine to calls to printf() in a single wrtie() ? Is it
the libc?
No. It's the compiler's optimiser.
Its certainly not compiler optimization as I compiled it with -O0
option.
BTW, write per se isn't likely to be a system call, but a wrapper to
one.

Nov 6 '07 #3
On Tue, 06 Nov 2007 12:26:25 -0800, omkar pangarkar wrote:
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]
<snip>
Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think.
You're thinking too simply. printf() may well be doing a lot of
processing before it calls write() (in fact, it is) which may be more
expensive than an additional system call. You can't know which is faster
by simply monitoring what is called.
Why is that? Who is telling our program
to combine to calls to printf() in a single wrtie() ? Is it the libc?
Yes. Standard IO under almost all self-respecting C libraries is
buffered.
Its certainly not compiler optimization as I compiled it with -O0
option.
Indeed not. I'd be upset if a compiler merged function calls like this.

Why are you playing about with such a trivial low-gain optimisation?
It's doubly pointless, as you're not even measuring the costs properly.
Perhaps similar reasons to your faulty optimisation of the word "you" is
at work?

B.
Nov 6 '07 #4
santosh wrote On 11/06/07 15:32,:
On Wednesday 07 Nov 2007 1:56 am omkar pangarkar <om*********@gmail.com>
wrote
>[... two printf() calls generate just one write() ...]

Why is that? Who is telling our
program to combine to calls to printf() in a single wrtie() ? Is it
the libc?


No. It's the compiler's optimiser.
What compiler does this? Libraries have been
buffering output since time immemorial, but I've
never seen a compiler merge two successive printf()
calls into one call. (I've seen a compiler replace
printf("Hello!\n") with puts("Hello!"), but never
the transformation you describe.)

--
Er*********@sun.com
Nov 6 '07 #5
On Nov 7, 1:38 am, Rob Kendrick <n...@rjek.comwrote:
On Tue, 06 Nov 2007 12:26:25 -0800, omkar pangarkar wrote:
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]

<snip>
Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think.

You're thinking too simply. printf() may well be doing a lot of
processing before it calls write() (in fact, it is) which may be more
expensive than an additional system call. You can't know which is faster
by simply monitoring what is called.
Why is that? Who is telling our program
to combine to calls to printf() in a single wrtie() ? Is it the libc?

Yes. Standard IO under almost all self-respecting C libraries is
buffered.
Its certainly not compiler optimization as I compiled it with -O0
option.

Indeed not. I'd be upset if a compiler merged function calls like this.

Why are you playing about with such a trivial low-gain optimisation?
It's doubly pointless, as you're not even measuring the costs properly.
Perhaps similar reasons to your faulty optimisation of the word "you" is
at work?

B.
This is not an attempt to optimize any code. I just need to know why
such thing is happening and who is behind it?

Nov 6 '07 #6

"omkar pangarkar" <om*********@gmail.comwrote in message
news:11*********************@k35g2000prh.googlegro ups.com...
On Nov 7, 1:38 am, Rob Kendrick <n...@rjek.comwrote:
>On Tue, 06 Nov 2007 12:26:25 -0800, omkar pangarkar wrote:
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]

<snip>
<snip>
>>
Indeed not. I'd be upset if a compiler merged function calls like this.

Why are you playing about with such a trivial low-gain optimisation?
It's doubly pointless, as you're not even measuring the costs properly.
Perhaps similar reasons to your faulty optimisation of the word "you" is
at work?

B.

This is not an attempt to optimize any code. I just need to know why
such thing is happening and who is behind it?
CRTL...

as others have noted, it does buffering, and may choose to write output in
larger chunks than what is initially passed to it.

I suspect, at least in the case of printf, that this buffering is usually
done until either:
the buffer is full;
a newline or similar is encountered.
for file IO, it is less clear if/when exactly contents are written, but we
do know at least that fflush and fclose cause contents to be written.

I am not sure if in general fflush has lower-level effects (for example, if
it also flushes OS-level file caching or commits changes to the underlying
filesystem, or if it only ensures that changes are commited to the OS
proper). this would mostly effect cases like, say, one calls fflush, and
then very shortly following, the kernel crashes or the power fails or
something...

Nov 6 '07 #7
On Tue, 06 Nov 2007 15:52:18 -0500, Eric Sosman wrote:
What compiler does this? Libraries have been
buffering output since time immemorial, but I've never seen a compiler
merge two successive printf() calls into one call. (I've seen a
compiler replace printf("Hello!\n") with puts("Hello!"), but never the
transformation you describe.)
stdio flushes its output buffer on every '\n'.

#include <stdio.h>
int main() {
char c, s[2] = "";
for (s[0] = 'A'; s[0] <= 'Z'; s[0]++)
puts(c);
for (c = 'a'; c <= 'z'; c++)
putchar(c);
putchar('\n');
return 0;
}

You will see that 26 write("A\n")..write("Z\n") syscalls are made, but
only one write("abcdefghijklmnopqrstuvwxyz\n") syscall is made.
Nov 7 '07 #8
On Wed, 7 Nov 2007 01:21:35 +0000 (UTC),
Tzy-Jye Daniel Lin <dt***@andrew.cmu.eduwrote:
On Tue, 06 Nov 2007 15:52:18 -0500, Eric Sosman wrote:
> What compiler does this? Libraries have been
buffering output since time immemorial, but I've never seen a compiler
merge two successive printf() calls into one call. (I've seen a
compiler replace printf("Hello!\n") with puts("Hello!"), but never the
transformation you describe.)

stdio flushes its output buffer on every '\n'.
Not necessarily. A stream can be unbuffered, fully buffered, or line
buffered (which is presumably what you think is always the case).
setvbuf() can be used to control this behaviour.

The C standard tells us that stderr is (initially) not fully buffered
(i.e. line buffered or unbuffered), and stdin and stdout are fully
buffered when a stream is determined not to be an interactive device.

\begin{offtopic}
On the OP's system, assuming it is some Unix-like system, stdout
will be line buffered when connected to an interactive terminal, and
fully buffered when connected to a non-interactive terminal.
\end{offtopic}

Martien
--
|
Martien Verbruggen | Louis Pasteur's theory of germs is ridiculous
| fiction -- Pierre Pachet, Professor of
| Physiology at Toulouse, 1872
Nov 7 '07 #9
In article <sl*****************@martien.heliotrope.home>,
Martien Verbruggen <mg**@tradingpost.com.auwrote:
....
>\begin{offtopic}
On the OP's system, assuming it is some Unix-like system, stdout
will be line buffered when connected to an interactive terminal, and
fully buffered when connected to a non-interactive terminal.
\end{offtopic}
\begin{compulsoryCLCnitpickMode (*)}
What's a "non-interactive terminal"?
\end{compulsoryCLCnitpickMode}

(*) Also known as "vying for points".

Nov 7 '07 #10
In article <47***********************@news.zen.co.uk>,
Rob Kendrick <nn**@rjek.comwrote:
....
>Why are you playing about with such a trivial low-gain optimisation?
It's doubly pointless, as you're not even measuring the costs properly.
Perhaps similar reasons ...
You would do well to Google the words "test", "experiment", and "learning".

Nov 7 '07 #11
Rob Kendrick <nn**@rjek.comwrites:
On Tue, 06 Nov 2007 12:26:25 -0800, omkar pangarkar wrote:
> I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall]

<snip>
>Hence in above example its clear that printf() is cheaper that write()
contrary to what we might think.

You're thinking too simply. printf() may well be doing a lot of
processing before it calls write() (in fact, it is) which may be more
expensive than an additional system call. You can't know which is faster
by simply monitoring what is called.
Yes you can. No one cares how long the "printf part is" - clearly the
value of importance is the total time to return.
>
>Why is that? Who is telling our program
to combine to calls to printf() in a single wrtie() ? Is it the libc?

Yes. Standard IO under almost all self-respecting C libraries is
buffered.
>Its certainly not compiler optimization as I compiled it with -O0
option.

Indeed not. I'd be upset if a compiler merged function calls like this.

Why are you playing about with such a trivial low-gain optimisation?
It's doubly pointless, as you're not even measuring the costs properly.
Perhaps similar reasons to your faulty optimisation of the word "you" is
at work?
I would imagine he is interested. And some people do run on systems
where every clock cycle gained is important. if more people thought like
that each and every time they check something in then maybe Word would
open faster on a dual core duo with 3 gigs of ram than it did 10 years
ago on a p3 with 128 megs.
Nov 7 '07 #12
Martien Verbruggen <mg**@tradingpost.com.auwrites:
On Wed, 7 Nov 2007 01:21:35 +0000 (UTC),
Tzy-Jye Daniel Lin <dt***@andrew.cmu.eduwrote:
>On Tue, 06 Nov 2007 15:52:18 -0500, Eric Sosman wrote:
>> What compiler does this? Libraries have been
buffering output since time immemorial, but I've never seen a compiler
merge two successive printf() calls into one call. (I've seen a
compiler replace printf("Hello!\n") with puts("Hello!"), but never the
transformation you describe.)

stdio flushes its output buffer on every '\n'.

Not necessarily. A stream can be unbuffered, fully buffered, or line
buffered (which is presumably what you think is always the case).
setvbuf() can be used to control this behaviour.

The C standard tells us that stderr is (initially) not fully buffered
(i.e. line buffered or unbuffered), and stdin and stdout are fully
buffered when a stream is determined not to be an interactive device.

\begin{offtopic}
\end{offtopic}
WTF is all this stuff? Postscript?
Nov 7 '07 #13
Before I get any further, just to answer the question in the subject
line (i.e., "are system calls sometimes costlier than library
calls"), the short answer is "yes". Of course, we also have to
define "system" vs "library" calls, and the short answer is useless,
because "sometimes" is not "always" and this does not really tell
us anything about any *particular* calls: a call to foo() may be
100 times slower than one to bar(), regardless of whether foo()
and/or bar() are "system calls" (whatever those are!).
>>>On Tue, 06 Nov 2007 12:26:25 -0800, omkar pangarkar wrote:
I have two simple hello world programs one using printf()[a
library func] and other using write() [syscall] ...
then later added this clarification:
>"omkar pangarkar" <om*********@gmail.comwrote in message
news:11*********************@k35g2000prh.googlegr oups.com...
>This is not an attempt to optimize any code. I just need to know why
such thing is happening and who is behind it?
Well, if you code one call to printf(), and one to write(), then
*you* are behind it, and it is happening because that is what you
wrote. :-)

If the question is "when and why does printf() choose to call the
underlying OS's `write' system call"...

In article <b2***************************@saipan.com>
cr88192 <cr*****@hotmail.comwrote:
>as others have noted, [the system's stdio library] does buffering,
and may choose to write output in larger chunks than what is
initially passed to it.

I suspect, at least in the case of printf, that this buffering is usually
done until either:
the buffer is full;
a newline or similar is encountered.
The C Standard allows, but does not require, an implementation to
do this sort of buffering. The C Standard *does* require that the
library "transmit" buffered data to the "host environment" under
various conditions, including (but not limited to):

- printing a newline to a line-buffered stream;
- various calls to fflush().

Any given stdio implementation may choose not to do any buffering
at all, which will trivially satisfy these requirements. Most real
implementations at least do *some*, because the "transmission to
the host environment" is done with something that has some extra
overhead (e.g., a "system call").

On host systems that provide some kind of protection -- so that an
"ordinary user program" cannot crash the machine, for instance --
requests that we (library and/or system implementors) tend to label
"system calls" have to do something that we (system implementors)
call "crossing a protection domain", to use the fully generalized
term. More specifically, in a Unix-like OS, a "system call" switches
from "user mode" to "kernel mode", using some sort of CPU-dependent
mechanism. Depending on the hardware (and to some extent, software),
this mode switch has a minimum cost of tens to even thousands of
nanoseconds, which is the equivalent of a few dozen to a few thousand
"ordinary instruction" times. In these specific cases, a "system
call" may well be, on average, about 20 to 200 times slower than
an "ordinary" function (or "library") call. (That is, if the code
for the operation could be moved from the kernel to a user library, a
call to that code would take about 1/20th to 1/200th as much time.
Of course, this tends to depend greatly on the code, and in most
cases there is some good reason that it cannot be moved this way.)

(Other host systems have lighter-weight mechanisms. On such systems,
a "system call" may take about the same amount of time as a "library
call". In this case, there is little reason to bother with fancy
buffering schemes. Some such systems do it anyway, either because
the code was imported from some other system in which it *was* a good
idea to buffer, or just to mimic the behavior of those systems.)
>for file IO, it is less clear if/when exactly contents are written,
but we do know at least that fflush and fclose cause contents to be
written.
(Or rather, "transmitted to the host environment", whatever that
ultimately means. Note that on some systems, a block of data sent
to the host, but not terminated with a newline, is simply buffered
inside the host, i.e., not yet presented to a human who may be
typing at a terminal. Fortunately, such systems are quite rare.)

More specifically, any stdio stream that is not connected to an
"interactive device" need not be line-buffered. Note that the
implementation -- whatever C system you are using -- determines
which stdio streams, if any, are connected to an "interactive
device". If the C system decrees that *all* output is to "interactive
devices", then *all* streams will, by default, be line-buffered or
unbuffered; if it decrees that *no* output is ever interactive, it
is possible that all output streams will be fully-buffered by
default.

In any case, you can call setbuf() or setvbuf() to control buffering.
Simply make an appropriate call before doing any output, and you
can arrange for a given output stream to be line-buffered or
un-buffered (or fully-buffered) at your choosing.
>I am not sure if in general fflush has lower-level effects (for
example, if it also flushes OS-level file caching or commits changes
to the underlying filesystem, or if it only ensures that changes
are commited to the OS proper). this would mostly effect cases
like, say, one calls fflush, and then very shortly following, the
kernel crashes or the power fails or something...
This depends not only on the C implementation but also on the
underlying OS. Some OSes implement "reliable" file systems that
never lose data, some implement "fast" file systems that can lose
data in a crash, some provide hybrids ("semi-fast" file systems
with optional partial or complete journaling, for instance), and
some provide everything.
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
Nov 7 '07 #14
On Wed, 07 Nov 2007 14:34:19 +0100, Richard wrote:
>You're thinking too simply. printf() may well be doing a lot of
processing before it calls write() (in fact, it is) which may be more
expensive than an additional system call. You can't know which is
faster by simply monitoring what is called.

Yes you can. No one cares how long the "printf part is" - clearly the
value of importance is the total time to return.
Knowing the total time to return is clearly different from knowing what
is called.

B.

Nov 7 '07 #15
"Richard" <rg****@gmail.coma écrit dans le message de news:
u9************@news.individual.net...
Martien Verbruggen <mg**@tradingpost.com.auwrites:
>On Wed, 7 Nov 2007 01:21:35 +0000 (UTC),
Tzy-Jye Daniel Lin <dt***@andrew.cmu.eduwrote:
>>On Tue, 06 Nov 2007 15:52:18 -0500, Eric Sosman wrote:

What compiler does this? Libraries have been
buffering output since time immemorial, but I've never seen a compiler
merge two successive printf() calls into one call. (I've seen a
compiler replace printf("Hello!\n") with puts("Hello!"), but never the
transformation you describe.)

stdio flushes its output buffer on every '\n'.

Not necessarily. A stream can be unbuffered, fully buffered, or line
buffered (which is presumably what you think is always the case).
setvbuf() can be used to control this behaviour.

The C standard tells us that stderr is (initially) not fully buffered
(i.e. line buffered or unbuffered), and stdin and stdout are fully
buffered when a stream is determined not to be an interactive device.

\begin{offtopic}
\end{offtopic}

WTF is all this stuff? Postscript?
looks like Latex to me.

--
Chqrlie.
Nov 8 '07 #16
"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
1194382339.750852@news1nwk...
santosh wrote On 11/06/07 15:32,:
>On Wednesday 07 Nov 2007 1:56 am omkar pangarkar <om*********@gmail.com>
wrote
>>[... two printf() calls generate just one write() ...]

Why is that? Who is telling our
program to combine to calls to printf() in a single wrtie() ? Is it
the libc?


No. It's the compiler's optimiser.

What compiler does this? Libraries have been
buffering output since time immemorial, but I've
never seen a compiler merge two successive printf()
calls into one call. (I've seen a compiler replace
printf("Hello!\n") with puts("Hello!"), but never
the transformation you describe.)
Which compiler was that?
Did it expand less trivial printf formats into a series of explicit calls to
conversion functions?

--
Chqrlie.
Nov 8 '07 #17
"Charlie Gordon" <ne**@chqrlie.orgwrites:
"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
>(I've seen a compiler replace
printf("Hello!\n") with puts("Hello!"), but never
the transformation you describe.)

Which compiler was that?
I think that GCC will do that, in some versions and at some
optimization levels.
Did it expand less trivial printf formats into a series of explicit calls to
conversion functions?
Haven't noticed it do that.
--
char a[]="\n .CJacehknorstu";int putchar(int);int main(void){unsigned long b[]
={0x67dffdff,0x9aa9aa6a,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x11f6},*p
=b,i=24;for(;p+=!*p;*p/=4)switch(0[p]&3)case 0:{return 0;for(p--;i--;i--)case+
2:{i++;if(i)break;else default:continue;if(0)case 1:putchar(a[i&15]);break;}}}
Nov 9 '07 #18
Ben Pfaff <bl*@cs.stanford.eduwrites:
"Charlie Gordon" <ne**@chqrlie.orgwrites:
>"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
>>(I've seen a compiler replace
printf("Hello!\n") with puts("Hello!")

Which compiler was that?

I think that GCC will do that, in some versions and at some
optimization levels.
Some gcc's (the one have to hand) can't be stopped from doing it -- at
least it seems to do it even with no optimisation turn on.

--
Ben.
Nov 9 '07 #19
"Ben Bacarisse" <be********@bsb.me.uka écrit dans le message de news:
87************@bsb.me.uk...
Ben Pfaff <bl*@cs.stanford.eduwrites:
>"Charlie Gordon" <ne**@chqrlie.orgwrites:
>>"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
(I've seen a compiler replace
printf("Hello!\n") with puts("Hello!")

Which compiler was that?

I think that GCC will do that, in some versions and at some
optimization levels.

Some gcc's (the one have to hand) can't be stopped from doing it -- at
least it seems to do it even with no optimisation turn on.
My guess is they found a simple way to shine on comparison charts for some
of the simpler tests, such as "total code size in statically linked
executable for simple hello.c". But static linking has become pretty rare
these days.

--
Chqrlie.
Nov 9 '07 #20
"Charlie Gordon" <ne**@chqrlie.orgwrites:
"Ben Bacarisse" <be********@bsb.me.uka écrit dans le message de news:
87************@bsb.me.uk...
>Ben Pfaff <bl*@cs.stanford.eduwrites:
>>"Charlie Gordon" <ne**@chqrlie.orgwrites:

"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
(I've seen a compiler replace
printf("Hello!\n") with puts("Hello!")

Which compiler was that?

I think that GCC will do that, in some versions and at some
optimization levels.

Some gcc's (the one have to hand) can't be stopped from doing it -- at
least it seems to do it even with no optimisation turn on.

My guess is they found a simple way to shine on comparison charts for some
of the simpler tests, such as "total code size in statically linked
executable for simple hello.c". But static linking has become pretty rare
these days.
That's a thought but it is not currently true in my hosted set up:

$ ls -l t.o t2.o
-rw-r--r-- 1 ben ben 864 Nov 9 01:31 t.o
-rw-r--r-- 1 ben ben 888 Nov 9 13:45 t2.o
$ ls -l t t2
-rwxr-xr-x 1 ben ben 475988 Nov 9 13:44 t
-rwxr-xr-x 1 ben ben 475476 Nov 9 13:45 t2
$ nm t.o t2.o

t.o:
00000000 T main
U puts

t2.o:
00000000 T main
U printf

They both have all the printf machinery linked in but it seems puts is
longer than the one-line wrapper that printf probably requires.
Something in the start-up or exit code path must require formatted
printed in this set up. The motivation may have come from embedded
uses, or some earlier version where this could be avoided, so your
idea is quite reasonable.

--
Ben.
Nov 9 '07 #21
"Ben Bacarisse" <be********@bsb.me.uka écrit dans le message de news:
87************@bsb.me.uk...
"Charlie Gordon" <ne**@chqrlie.orgwrites:
>"Ben Bacarisse" <be********@bsb.me.uka écrit dans le message de news:
87************@bsb.me.uk...
>>Ben Pfaff <bl*@cs.stanford.eduwrites:

"Charlie Gordon" <ne**@chqrlie.orgwrites:

"Eric Sosman" <Er*********@sun.coma écrit dans le message de news:
>(I've seen a compiler replace
>printf("Hello!\n") with puts("Hello!")
>
Which compiler was that?

I think that GCC will do that, in some versions and at some
optimization levels.

Some gcc's (the one have to hand) can't be stopped from doing it -- at
least it seems to do it even with no optimisation turn on.

My guess is they found a simple way to shine on comparison charts for
some
of the simpler tests, such as "total code size in statically linked
executable for simple hello.c". But static linking has become pretty
rare
these days.

That's a thought but it is not currently true in my hosted set up:

$ ls -l t.o t2.o
-rw-r--r-- 1 ben ben 864 Nov 9 01:31 t.o
-rw-r--r-- 1 ben ben 888 Nov 9 13:45 t2.o
$ ls -l t t2
-rwxr-xr-x 1 ben ben 475988 Nov 9 13:44 t
-rwxr-xr-x 1 ben ben 475476 Nov 9 13:45 t2
$ nm t.o t2.o

t.o:
00000000 T main
U puts

t2.o:
00000000 T main
U printf

They both have all the printf machinery linked in but it seems puts is
longer than the one-line wrapper that printf probably requires.
Something in the start-up or exit code path must require formatted
printed in this set up. The motivation may have come from embedded
uses, or some earlier version where this could be avoided, so your
idea is quite reasonable.
Here I get a 537k statically linked executable with a ton of link time
warnings. It is so sad the Gnu libc has turned into so much bloated useless
crap. hello.c should compile to just a few kilobytes of executable image
with everything linked in and just the system call interface. How bad is it
on the BSD font?

--
Chqrlie.
Nov 9 '07 #22

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
3503
by: markus | last post by:
Hi, I have a question that deals with the standard c library VS (Unix) system calls. The question is: which header files (and functions) are part of the C library and which header files (and...
22
2632
by: markus | last post by:
Hi, There are more than 1000 defined system calls in the Unix standard specification, however, a majority of them are optional and the availability of system calls are dependent on the OS...
7
6935
by: rahul8143 | last post by:
hello, what is difference between system call and library function call? Does library function call can have context switch to kernel mode? regards, rahul
6
3437
by: pakis | last post by:
I am having a problem of pure virtual function call in my project. Can anyone explaine me the causes of pure virtual function calls other than calling a virtual function in base class? Thanks
11
2743
by: talk | last post by:
hi,guy i have a question. are the functions in <stdio.h> system calls provided by operation system? if so, i want to know how C implements that we can call system calls by using the functions in...
6
2333
by: leoman730 | last post by:
This is one of the interview question this morning, hope someone can help out with this. Thanks. What is the different between System call and library call?
0
2341
by: TraceyAnnison | last post by:
I wonder if you can help me - I'm new to this, and working in a project that has already been configured to work with Axis. We have a Java project built with the Spring framework, in order to...
16
8358
by: Paul Schwann | last post by:
Hi group, I am relatively new to C# (although I have a lot of programming excperience in other languages like Java and C). Currently I am searching for a solution to this problem: Suppose you...
3
6900
by: sriram347 | last post by:
Hi I am a newbie to ASP.NET. I developed a web page (project type is web application) and I keep getting this error. B]Error message : "System.AccessViolation Exception attempted to read or...
0
6964
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7123
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
7175
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
1
6842
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
7319
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
5430
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
4864
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
3070
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
598
muto222
php
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.