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

...IDE, compilers, κλπ

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

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

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

Εγώ δεν έχω καταλάβει την ερώτηση. Βασικά, ότι πρόγραμμα και να τρέξεις ποτέ δεν θα εκτελεστεί στον ίδιο χρόνο, διότι μεσολαβούν πάμπολλοι αστάθμητοι παράγοντες σε κάθε του εκτέλεση (πέρα από τα προβλήματα ακρίβειας των μετρήσεων).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Νομίζω η ερώτησή του είναι: πώς διάολο γίνεται να γράφει 100 εκατομμύρια φορές σε ένα αρχείο τόσο γρήγορα;
Εμένα σε dual core έγραψε 1 εκατομ. φορές σε ~20 δευτερόλεπτα σύμφωνα με την εντολή time.
Κύπριος; Κόπιασε στο 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

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

Δεν ξέρω, μας δίνει ελάχιστες πληροφορίες.

Το time δεν κάνει πάντως για τέτοιου είδους μετρήσεις. Καλύτερα να κάνει compile με flag -pg και να δει κατόπιν τους χρόνους στο gprof.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

medigeek έγραψε:Νομίζω η ερώτησή του είναι: πώς διάολο γίνεται να γράφει 100 εκατομμύρια φορές σε ένα αρχείο τόσο γρήγορα;
Εμένα σε dual core έγραψε 1 εκατομ. φορές σε ~20 δευτερόλεπτα σύμφωνα με την εντολή time.


Κατά ένα λόγω, caching. Η κάθε δημιουργία αρχείου δεν πάει καν στο δίσκο. Ανάλογα με τις τρέχουσες επιλογές για το ext4 (τέτοιο είναι;), μπορεί να περιμένει μερικά λεπτά για να γράψει τα δεδομένα στο δίσκο.
Με χρήση λογισμικού profiling (π.χ. gprof), μπορείς να δεις τι ακριβώς κάνει ένα πρόγραμμα. Ωστόσο, για profiling συναρτήσεων της βασικής βιβλιοθήκης του Ubuntu, μάλλον θέλεις να βάλεις τα πακέτα -dbg της glibc. Είναι πιθανό να θέλει κάτι παραπάνω για τη 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 » 12 Μαρ 2012, 01:09

Στην πραγματικότητα δεν εμφανίζει καν sec. ¨Εχω μόνο Milisec! Αυτό είναι το περίεργο... :/ Εγώ περίμενα να βγάλει κάποια sec. ¨Εστω και ένα!!!!

edit: θα το πάρω αλλιώς, για να γίνει ένα fgets() θα δουλέψει και ο πυρήνας? :/ και αν ναι, για να γίνουν 100.000.000 σε πραγματικό χρόνο ας πούμε 5 sec πόσο περίπου χρόνο θα έχει ο πυρήνας? 4.9 , 2, 1sec?
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 12 Μαρ 2012, 02:10

linuxs έγραψε:
edit: θα το πάρω αλλιώς, για να γίνει ένα fgets() θα δουλέψει και ο πυρήνας? :/ και αν ναι, για να γίνουν 100.000.000 σε πραγματικό χρόνο ας πούμε 5 sec πόσο περίπου χρόνο θα έχει ο πυρήνας? 4.9 , 2, 1sec?


Το πρόγραμμα που έδωσες στην αρχή είναι ελλιπές. Δώσε ένα πλήρες πρόγραμμα που δοκιμάζεις ως λογισμικό αναφοράς.
Μπορείς να μεταγλωττίσεις με
Κώδικας: Επιλογή όλων

gcc -S myprog.c


για να διαβάσεις τον κώδικα σε Assembly, εξαιρετικά σημαντικό αν ο gcc κάνει βελτιστοποιήσεις. Για παράδειγμα, αν δε γράψεις σωστά τον κώδικα, μια βελτιστοποίηση είναι αφαιρέσει το νεκρό κώδικα.
προσωπικό ιστολόγιο ϗ πλανήτης 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

Δημοσίευσηαπό medigeek » 12 Μαρ 2012, 02:17

Νομίζω δεν μπορείς να υπολογίσεις αυτό τον χρόνο. Κι αν τον υπολογισεις, στο δικό σου υπολογιστή θα είναι 3, στον υπολογιστή του Γιάννη θα είναι 5, του Κώστα 13 που έχει pentium III. Δεν είναι standard 5/1 = 5.

linuxs έγραψε:
Στην πραγματικότητα δεν εμφανίζει καν sec. ¨Εχω μόνο Milisec! Αυτό είναι το περίεργο... :/ Εγώ περίμενα να βγάλει κάποια sec. ¨Εστω και ένα!!!!

OK, τώρα με σύγχισες τελείως. :)

1. Δείξε ολόκληρο τον κώδικα, μαζί με το getitimer(). Ο κώδικας που έδωσες στο πρώτο ποστ δεν βγάζει νόημα.
2. Ως σημείωση, το for loop αναφέρει πως είναι σε C99:
έγραψε:gcc -Wall -o "test" "test.c" (in directory: /home/forger/Desktop)
test.c: In function ‘main’:
test.c:9:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
test.c:9:5: note: use option -std=c99 or -std=gnu99 to compile your code
Compilation failed.
test.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]

3. Το fputs θέλει "FILE *":
έγραψε:gcc -Wall -o "test" "test.c" (in directory: /home/forger/Desktop)
Compilation failed.
test.c: In function ‘main’:
test.c:11:9: error: incompatible type for argument 2 of ‘fputs’
/usr/include/stdio.h:682:12: note: expected ‘struct FILE * __restrict__’ but argument is of type ‘FILE’

4. Επίσης πρέπει να θέσεις το output αρχείο:
έγραψε:gcc -Wall -o "test" "test.c" (in directory: /home/forger/Desktop)
test.c: In function ‘main’:
test.c:11:14: warning: ‘infile’ may be used uninitialized in this function [-Wuninitialized]
Compilation finished successfully.

Αλλιώς παίρνεις segmentation fault.

Ένα παράδειγμα κώδικα, παρόμοιο με αυτό που βάζεις εσύ:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main() {
FILE * infile;
char buf[100];
int n;

infile = fopen("mylog.txt","a");
while (1) {
if (n >= 100000000) { fclose(infile); return 0; }
fputs(buf, infile);
n++;
}
return 0;
}

(με 100 εκατομμ. και ανοίγουμε το αρχείο 1 φορά)

Νομίζω κατάλαβα το πρόβλημα (ή την ερώτηση τελοσπάντων)... ο κώδικας είναι σωστός, αλλά το char buf[100] είναι ένα κενό variable. Αφού το char buf είναι κενό, υποθέτω πως ανοίγει το αρχείο αλλά δεν γράφει τίποτα (χαρακτήρας \0 ή 1 byte ; Δεν ξέρω). Στο αρχείο μπαίνει μόνο 1 byte (;) σε κάθε γύρο του loop [ Το ίδιο συμβαίνει όταν βάλεις το fopen() μέσα στο while loop. ]

Αν βάλεις το fopen() μέσα στο loop θα καθυστερήσει αφού ανοιγοκλείνει το αρχείο συνέχεια:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main() {
FILE * infile;
char buf[100];
int n;

while (1) {
if (n >= 100000000) { return 0; }
infile = fopen("mylog.txt","a");
fputs(buf, infile);
fclose(infile);
n++;
}
return 0;
}
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό Star_Light » 18 Μαρ 2012, 18:24

linuxs έγραψε:Καλησπέρα,

έχω μια άσκηση για την σχολή και έχω ένα προβληματάκι. Μπορεί κάποιος να μου αν ξέρει πως ακριβώς δουλεύει η 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 σε κάθε ένα. Είναι πιστευτά? :/ Δεν μπορούμε να ξέρουμε πόσο ακριβώς έιναι αλλα είναι κάθόλου λογικά τα παραπάνω? ;/

ευχαριστώ πολύ για κάθε απάντηση.!


Ρε συ περα και απο το φορουμ μας σε κάποιο ξένο τσατ να ρωτήσεις ανθρωπους που
ασχολουνται με το συγκεκριμενο πραγμα σκέφτηκες?????
Εχουν φοβερη υποστηριξη και εκει.... μπορεις να μπεις να ρωτησεις οτι θελεις
υπάρχουν ειδικα τσατ ρουμς για καθε ερωτηση. Θα στα εξηγησουν ολα. Ειναι πολυ καλοι. ;)
Τελευταία επεξεργασία από Star_Light και 18 Μαρ 2012, 18:40, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 18 Μαρ 2012, 18:34

Να προτιμας να ρωτας πολλους προγραμματιστες για να παιρνεις
πολλες γνωμες και στο τελος να φτιαχνεις την δικια σου εκδοχη ;)
Καθενας εχει να σου πει κατι σωστο. Μην περιοριζεσαι
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Προηγούμενη

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

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