How does 200 million function call of fgets translate into only 25,224 system calls?
A I/O efficency test from APUE:
Test file is said to be 98.5 MB with 3 million lines
.
Code used in "Figure 3.6":
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
best time from Figure 3.6: Use different BUFFSIZE
and choose the best time
single byte time from Figure 3.6: Use BUFFSIZE=1
err_sys
is merely a wrapper function for error handling.
apue.h
is a also wrapper header file.
Code uses fgets
:
#include "apue.h"
int
main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF){
if (fputc(c, stdout) == EOF)
err_sys("output error");
}
if (ferror(stdin))
err_sys("input error");
exit(0);
}
The question comes from:
The last point of interest with these timing numbers is that the
fgetc
version is so much faster than theBUFFSIZE=1
version from Figure 3.6. Both involve the same number of function calls—about 200 million—yet thefgetc
version is more than 16 times faster in terms of user CPU time and almost 39 times faster in terms of clock time.
The difference is that the version using read executes 200 million function calls, which in turn execute 200 million system calls. With thefgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls. System calls are
usually much more expensive than ordinary function calls.
The test file is 98.5MB
≈ 100M
, so 100 million calls for each I/O function call == 200 million calls, no problem here.
But how does 200 million fgets
translate into 25,224 system call:
With the
fgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls.
?
How is 25,224 calculated?
files io
add a comment |
A I/O efficency test from APUE:
Test file is said to be 98.5 MB with 3 million lines
.
Code used in "Figure 3.6":
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
best time from Figure 3.6: Use different BUFFSIZE
and choose the best time
single byte time from Figure 3.6: Use BUFFSIZE=1
err_sys
is merely a wrapper function for error handling.
apue.h
is a also wrapper header file.
Code uses fgets
:
#include "apue.h"
int
main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF){
if (fputc(c, stdout) == EOF)
err_sys("output error");
}
if (ferror(stdin))
err_sys("input error");
exit(0);
}
The question comes from:
The last point of interest with these timing numbers is that the
fgetc
version is so much faster than theBUFFSIZE=1
version from Figure 3.6. Both involve the same number of function calls—about 200 million—yet thefgetc
version is more than 16 times faster in terms of user CPU time and almost 39 times faster in terms of clock time.
The difference is that the version using read executes 200 million function calls, which in turn execute 200 million system calls. With thefgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls. System calls are
usually much more expensive than ordinary function calls.
The test file is 98.5MB
≈ 100M
, so 100 million calls for each I/O function call == 200 million calls, no problem here.
But how does 200 million fgets
translate into 25,224 system call:
With the
fgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls.
?
How is 25,224 calculated?
files io
add a comment |
A I/O efficency test from APUE:
Test file is said to be 98.5 MB with 3 million lines
.
Code used in "Figure 3.6":
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
best time from Figure 3.6: Use different BUFFSIZE
and choose the best time
single byte time from Figure 3.6: Use BUFFSIZE=1
err_sys
is merely a wrapper function for error handling.
apue.h
is a also wrapper header file.
Code uses fgets
:
#include "apue.h"
int
main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF){
if (fputc(c, stdout) == EOF)
err_sys("output error");
}
if (ferror(stdin))
err_sys("input error");
exit(0);
}
The question comes from:
The last point of interest with these timing numbers is that the
fgetc
version is so much faster than theBUFFSIZE=1
version from Figure 3.6. Both involve the same number of function calls—about 200 million—yet thefgetc
version is more than 16 times faster in terms of user CPU time and almost 39 times faster in terms of clock time.
The difference is that the version using read executes 200 million function calls, which in turn execute 200 million system calls. With thefgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls. System calls are
usually much more expensive than ordinary function calls.
The test file is 98.5MB
≈ 100M
, so 100 million calls for each I/O function call == 200 million calls, no problem here.
But how does 200 million fgets
translate into 25,224 system call:
With the
fgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls.
?
How is 25,224 calculated?
files io
A I/O efficency test from APUE:
Test file is said to be 98.5 MB with 3 million lines
.
Code used in "Figure 3.6":
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
best time from Figure 3.6: Use different BUFFSIZE
and choose the best time
single byte time from Figure 3.6: Use BUFFSIZE=1
err_sys
is merely a wrapper function for error handling.
apue.h
is a also wrapper header file.
Code uses fgets
:
#include "apue.h"
int
main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF){
if (fputc(c, stdout) == EOF)
err_sys("output error");
}
if (ferror(stdin))
err_sys("input error");
exit(0);
}
The question comes from:
The last point of interest with these timing numbers is that the
fgetc
version is so much faster than theBUFFSIZE=1
version from Figure 3.6. Both involve the same number of function calls—about 200 million—yet thefgetc
version is more than 16 times faster in terms of user CPU time and almost 39 times faster in terms of clock time.
The difference is that the version using read executes 200 million function calls, which in turn execute 200 million system calls. With thefgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls. System calls are
usually much more expensive than ordinary function calls.
The test file is 98.5MB
≈ 100M
, so 100 million calls for each I/O function call == 200 million calls, no problem here.
But how does 200 million fgets
translate into 25,224 system call:
With the
fgetc
version, we still execute 200 million function calls, but this translates into only 25,224 system calls.
?
How is 25,224 calculated?
files io
files io
asked 2 mins ago
RickRick
1115
1115
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504406%2fhow-does-200-million-function-call-of-fgets-translate-into-only-25-224-system-ca%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f504406%2fhow-does-200-million-function-call-of-fgets-translate-into-only-25-224-system-ca%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown