Ερώτηση για fputs() στην C

...IDE, compilers, κλπ

Συντονιστής: konnn

Ερώτηση για fputs() στην C

Δημοσίευσηαπό linuxs » 11 Μαρ 2012, 13:46

Καλησπέρα,

έχω μια άσκηση για την σχολή και έχω ένα προβληματάκι. Μπορεί κάποιος να μου αν ξέρει πως ακριβώς δουλεύει η fputs? :/

Κώδικας: Επιλογή όλων

FILE infile;
char buf[100];

/* Open file here */
for(0 -> 100){
fputs(buf, infile);
}

Μετράω τα παρακάτω με κάποιον Handler και χρησιμοποιώντας την getitimer().
Σίγουρα χρησιμοποιείται ο CPU για να γίνουν οι εγγραφές στο αρχείο. Ο πυρήνας ίσως χρειαστεί για λίγα Milisec για αν ανοίξει το αρχείο και φυσικά ο πραγματικός χρόνος θα αυξάνεται. Οι τιμές που πέρνω για 100.000.000 εγγραφές είναι:
REAL: 30 s
CPU: 10 s
KERNEL: 5 s

και κάποια Milisec σε κάθε ένα. Είναι πιστευτά? :/ Δεν μπορούμε να ξέρουμε πόσο ακριβώς έιναι αλλα είναι κάθόλου λογικά τα παραπάνω? ;/

ευχαριστώ πολύ για κάθε απάντηση.!
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό medigeek » 11 Μαρ 2012, 14:43

Αν και δεν ξέρω πολλά από C/C++:

https://www.gnu.org/software/libc/manua ... utput.html
έγραψε:Function: int fputs (const char *s, FILE *stream)
The function fputs writes the string s to the stream stream. The terminating null character is not written. This function does not add a newline character, either. It outputs only the characters in the string.
This function returns EOF if a write error occurs, and otherwise a non-negative value.
For example:
Κώδικας: Επιλογή όλων

fputs ("Are ", stdout);
fputs ("you ", stdout);
fputs ("hungry?\n", stdout);

outputs the text ‘Are you hungry?’ followed by a newline.

http://www.cplusplus.com/reference/clib ... dio/fputs/
Κώδικας: Επιλογή όλων
/* fputs example */
#include <stdio.h>

int main ()
{
FILE * pFile;
char sentence [256];

printf ("Enter sentence to append: ");
fgets (sentence,255,stdin);
pFile = fopen ("mylog.txt","a");
fputs (sentence,pFile);
fclose (pFile);
return 0;
}


Αν ανοίγεις/γράφεις σε αρχείο, λογικά θα καθυστερήσει. Εξαρτάται από την ταχύτητα του σκληρού δίσκου.
Δοκίμασε με SSD δίσκο και μάλλον θα δεις διαφορά. :)

Σε python όταν ανοίγω/γράφω σε αρχείο, προτιμώ να το κάνω μια φορά και να μετατρέπω το αρχείο ως text string.
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό linuxs » 11 Μαρ 2012, 16:50

Όχι δεν κατάλαβες... :P ΘΕΛΩ να αργήσει!!!! :lol: απλά θεωρώ πως θα έπρεπε να είχε περισσότερο χρόνο πυρήμα. Η fgets χρησιμοποιεί τον πυρήνα η όχι? :/ Όταν γράφεται ένα string σε ένα αρχείο απλα ο CPU χρησιμοποιείται? :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό medigeek » 11 Μαρ 2012, 18:46

Α δεν έχω ιδέα. :P Λαϊκιστί, πιστεύω ότι o kernel λέει στην κεντρική μονάδα «θέλω το τάδε αρχείο από τον τάδε δισκο». Άρα program <=> kernel <=> cpu <=> disk

Ο migf1 σίγουρα θα ξέρει. :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό simosx » 11 Μαρ 2012, 20:14

Κώδικας: Επιλογή όλων
REAL: 30 s
CPU: 10 s
KERNEL: 5 s


Το ερώτημά σου είναι, ποια είναι η ερμηνεία των καθένα από τα παραπάνω.
Και εδώ βλέπεις στην τεκμηρίωση του Bash για την εσωτερική εντολή time.

Για παράδειγμα, το «KERNEL» είναι ο χρόνος που ο κώδικας χρησιμοποίησε κώδικα που έτρεχε σε κατάσταση πυρήνα (kernel mode, σε αντίθεση με user mode).
Συναρτήσεις όπως το fputs() είναι συναρτήσεις της βασικής βιβλιοθήκης glibc, και τρέχουν σε κατάσταση χρήστη. Μέσα στις συναρτήσεις αυτές γίνονται οι προσβάσεις προς τον πυρήνα, και όχι απευθείας.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό linuxs » 11 Μαρ 2012, 20:21

simosx έγραψε:
Κώδικας: Επιλογή όλων
REAL: 30 s
CPU: 10 s
KERNEL: 5 s


Το ερώτημά σου είναι, ποια είναι η ερμηνεία των καθένα από τα παραπάνω.
Και εδώ βλέπεις στην τεκμηρίωση του Bash για την εσωτερική εντολή time.

Για παράδειγμα, το «KERNEL» είναι ο χρόνος που ο κώδικας χρησιμοποίησε κώδικα που έτρεχε σε κατάσταση πυρήνα (kernel mode, σε αντίθεση με user mode).
Συναρτήσεις όπως το fputs() είναι συναρτήσεις της βασικής βιβλιοθήκης glibc, και τρέχουν σε κατάσταση χρήστη. Μέσα στις συναρτήσεις αυτές γίνονται οι προσβάσεις προς τον πυρήνα, και όχι απευθείας.


Απο το όλα αυτά που ρώτησα αυτό κατάλαβες? :O Ξέρω τι είναι το καθένα και πολύ περισσότερες λεπτομέριες απο όσες ανέφερα. Δεν είναι εκεί το πρόβλημά μου! ρωτάω αν θα έπρεπε να έχει περισσότερη χρήση ο πυρήνας!!! :P :P :P
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό simosx » 11 Μαρ 2012, 20:47

linuxs έγραψε: Η fgets χρησιμοποιεί τον πυρήνα η όχι? :/ Όταν γράφεται ένα string σε ένα αρχείο απλα ο CPU χρησιμοποιείται? :/


linuxs έγραψε:Ξέρω τι είναι το καθένα και πολύ περισσότερες λεπτομέριες απο όσες ανέφερα. Δεν είναι εκεί το πρόβλημά μου! ρωτάω αν θα έπρεπε να έχει περισσότερη χρήση ο πυρήνας!!!


Το ερώτημα που κάνεις είναι διερευνητικό. Αυτό σημαίνει ότι, γνωρίζοντας τα βασικά όπως αναφέρεις, πρέπει να είσαι σε θέση να εξηγήσεις τη θέση που έχεις στο ερώτημά σου. Για να σε βοηθήσω περισσότερο, δες για εργαλεία profiling, όπου παρέχουν περισσότερες λεπτομέρειες στις μετρήσεις από ότι ο Bash. Ακόμα, δες την τεκμηρίωσή τους.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό linuxs » 11 Μαρ 2012, 20:52

Πρέπει να χρησιμοποιήσω το bash. Είναι προγράμματα σε C αυτά δυστυχώς. Στην πραγματικότητα δεν έχω τόσο πρόβλημα με την fgets. Δεν με απασχολεί! Απλα θέλω να ξέρω αν θα έπρεπε να έχει πιο πολύ χρόνο πυρήνα. Αυτό δεν έχει σχε'ση με τον κώδικα
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό medigeek » 11 Μαρ 2012, 22:13

linuxs έγραψε:Οι τιμές που πέρνω για 100.000.000 εγγραφές είναι:
REAL: 30 s
CPU: 10 s
KERNEL: 5 s
[...] Είναι πιστευτά? :/

Τώρα κατάλαβα.. είναι πρόβλημα φαίνεται με το getitimer(). Έχεις κάπου ολόκληρο τον κώδικα για να το κοιτάξουμε/δοκιμάσουμε;

Εξαρτάται από το CPU φαίνεται και μάλλον ήδη έχει(ς) SSD δίσκο(;). Αυτές τις τιμές τις παίρνεις στον υπολογιστή της υπογραφής σου; Είσαι σίγουρος πως είναι 100 000 000 ; :P

Δοκίμασε αυτό:
testfputs.c
Μορφοποιημένος Κώδικας: Επιλογή όλων
/* fputs example */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
FILE * pFile;
char str[10] = "test";
strcat(str, "\n");
int i = 0;
while (1) {
if (i == 1000000) { return 0; }
pFile = fopen ("mylog.txt","a");
fputs (str, pFile);
fclose (pFile);
i++;
}
return 0;
}

Θα επαναλάβει ένα εκατομμύριο φορές (1.000.000) τη διαδικασία γραφής με το while.

Στο δικό μου υπολογιστή (dual core):
έγραψε:$ time ./testfputs

real 0m18.997s
user 0m2.280s
sys 0m13.565s
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Ερώτηση για fputs() στην C

Δημοσίευσηαπό medigeek » 11 Μαρ 2012, 22:26

Ίσως δεν αντιστοιχεί σε milliseconds.. μπορεί τα ticks να είναι λιγότερα και ο χρόνος εκτέλεσης εμφανίζεται λιγότερος; Το χρονομέτρησες με ρολόι; :P

Δοκίμασε με το gettimeofday(): http://stackoverflow.com/questions/2198 ... nning-time
..ή με το gprof για ανάλυση του κώδικα: http://sourceware.org/binutils/docs-2.2 ... index.html
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Επόμενο

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού