Πιο γρήγορα στρινγκς!

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Πιο γρήγορα στρινγκς!

Δημοσίευση από pimpogio » 13 Ιούλ 2011 17:26

προσεξε εδω

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

  @Override
    public void run() {
        for &#40;int i = 1; i <= n; i++&#41; &#123;
            for &#40;int j = 0; j < BSIZE; j++&#41; &#123; 
                block&#91;j&#93; = CHARS&#91;r.nextInt&#40;CHARS.length&#41;&#93;;
                if &#40;j % CHARS_PER_LINE == 0 && j != 0&#41; &#123;
                    block&#91;j - 1&#93; = '\r';
                    block&#91;j&#93; = '\n';
                &#125;
            &#125;// <-- exoune ipologistei ta strings sto telos autou tou loop prin na kanei block o paragogos
            block&#91;BSIZE - 2&#93; = '\r';
            block&#91;BSIZE - 1&#93; = '\n';

            try &#123;

                prodBuf.put&#40;block&#41;; //<-- edo kanei block o paragogos alla ta strings einai idi ipologismena
            &#125; catch &#40;InterruptedException e&#41; &#123;
                return;
            &#125;

        &#125;
    &#125; 
το blokarisma γινετε ενω εχει ηδη υπολογιστει ο buffer το loop υπολογισμου ειναι παραπανω
και η καθυστερηση ειναι στο switching οχι στον υπολογισμο των strings

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από cherouvim » 13 Ιούλ 2011 17:30

Εννοώ οτι αν παράγεις 1 και καταναλώνεις 10 τότε ο 2ος σίγουρα θα περιμένει την περισσότερη ώρα. Σωστά;

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Πιο γρήγορα στρινγκς!

Δημοσίευση από pimpogio » 13 Ιούλ 2011 17:33

ετσι ειναι αλλα αν δεν περιμενει θα καιει αδικα την cpu για να παραγει αχρειαστα δεδομενα...

σε δοκιμη που εκανα απο περιεργια η διαφορα στην αποδοση αναμεσα στους java κ php κωδικες ειναι τεραστια 4'' vs 69'' τοσο μεγαλη...

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

//se php
$ time php-cgi FileWrite.php
X-Powered-By&#58; PHP/5.3.6-13
Content-type&#58; text/html


real    1m8.978s
user    1m8.776s
sys     0m0.192s
$ du -sh data.txt
40M     data.txt
$ wc -l data.txt
4096000 data.txt

-------------------------------------
//se java
$ time java FileWrite

real    0m3.731s
user    0m3.780s
sys     0m0.284s
$ du -sh Output.txt
40M     Output.txt
$ wc -l Output.txt
4096000 Output.txt

//oi kodikes

//php
$ cat FileWrite.php
<?php
$fp = @fopen&#40;"data.txt", "w"&#41;;
if &#40;$fp !== false&#41;
&#123;
        for &#40;$i = 0; $i < 10; $i++&#41;
        &#123;
                $data = "";
                for &#40;$j = 0; $j < 409600; $j++&#41;
                        $data .= random_gen&#40;&#41; . "\r\n";
                fwrite&#40;$fp, $data&#41;;
        &#125;
        fclose&#40;$fp&#41;;
&#125;

function random_gen&#40;&#41;
&#123;
        static $characters = "0123456789abcdefghijklmnopqrstuvwxyz";

        return  $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;
                . $characters&#91;mt_rand&#40;0, 35&#41;&#93;;
&#125;

?>


---------------------------------------------------------------------------------------
//java

$ cat FileWrite.java
// Filename&#58; FileWrite.java
// compile&#58; javac FileWrite.java
// run&#58; java FileWrite
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

public class FileWrite &#123;

    private static final int BLOCKS = 10; // posa blocks tha grapseis

    public static void main&#40;String&#91;&#93; args&#41; throws IOException &#123;
        Buffer buf = new Buffer&#40;&#41;;

        Thread prod = new Thread&#40;new Producer&#40;BLOCKS, buf&#41;&#41;;
        Thread cons = new Thread&#40;new Consumer&#40;BLOCKS, buf, "Output.txt"&#41;&#41;;

        prod.start&#40;&#41;;
        cons.start&#40;&#41;;

        try &#123;
            prod.join&#40;&#41;;
            cons.join&#40;&#41;;
        &#125; catch &#40;InterruptedException e&#41; &#123;
            return;
        &#125;
    &#125;
&#125;

class Buffer &#123;

    private char&#91;&#93; contents;
    private boolean empty = true;

    public synchronized void put&#40;char&#91;&#93; buf&#41; throws InterruptedException &#123;
        while &#40;empty == false&#41; &#123;
            try &#123;
                wait&#40;&#41;;
            &#125; catch &#40;InterruptedException e&#41; &#123;
                throw e;
            &#125;
        &#125;
        contents = buf;
        empty = false;
        notify&#40;&#41;;
    &#125;

    public synchronized char&#91;&#93; get&#40;&#41; throws InterruptedException &#123;
        while &#40;empty == true&#41; &#123;
            try &#123;
                wait&#40;&#41;;
            &#125; catch &#40;InterruptedException e&#41; &#123;
                throw e;
            &#125;
        &#125;
        empty = true;
        notify&#40;&#41;;
        return contents;
    &#125;
&#125;

class Producer implements Runnable &#123;

    private final static char&#91;&#93; CHARS = &#123;'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'z', 'l',
        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'm'&#125;;
    private final static int BSIZE = 1000 * 4096; // megethos block
    private final static int CHARS_PER_LINE = 10; // xaraktires ana grami
    private Random r;
    private int n;
    private Buffer prodBuf;
    private char&#91;&#93; block;

    public Producer&#40;int m, Buffer buf&#41; &#123;
        n = m;
        prodBuf = buf;
        r = new Random&#40;System.currentTimeMillis&#40;&#41;&#41;;
        block = new char&#91;BSIZE&#93;;
    &#125;

    @Override
    public void run&#40;&#41; &#123;
        for &#40;int i = 1; i <= n; i++&#41; &#123;
            for &#40;int j = 0; j < BSIZE; j++&#41; &#123;
                block&#91;j&#93; = CHARS&#91;r.nextInt&#40;CHARS.length&#41;&#93;;
                if &#40;j % CHARS_PER_LINE == 0 && j != 0&#41; &#123;
                    block&#91;j - 1&#93; = '\r';
                    block&#91;j&#93; = '\n';
                &#125;
            &#125;
            block&#91;BSIZE - 2&#93; = '\r';
            block&#91;BSIZE - 1&#93; = '\n';

            try &#123;

                prodBuf.put&#40;block&#41;;
            &#125; catch &#40;InterruptedException e&#41; &#123;
                return;
            &#125;

        &#125;
    &#125;
&#125;

class Consumer implements Runnable &#123;

    FileWriter fstream;
    BufferedWriter out;
    private int n;
    private Buffer consBuf;

    public Consumer&#40;int m, Buffer buf, String fname&#41; throws IOException &#123;
        n = m;
        consBuf = buf;
        fstream = new FileWriter&#40;fname&#41;;
        out = new BufferedWriter&#40;fstream&#41;;
    &#125;

    @Override
    public void run&#40;&#41; &#123;
        try &#123;
            for &#40;int i = 1; i <= n; i++&#41; &#123;
                out.write&#40;consBuf.get&#40;&#41;&#41;;
               // System.out.println&#40;"Block&#58;" + i + " written.."&#41;;
            &#125;
            out.close&#40;&#41;;
        &#125; catch &#40;InterruptedException e&#41; &#123;
            return;
        &#125; catch &#40;IOException e&#41; &#123;
            return;
        &#125;

    &#125;
&#125;



gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από gvre » 13 Ιούλ 2011 18:24

Με το παρακάτω πολύ απλό προγραμματάκι και χωρίς ιδιαίτερα optimizations ο χρόνος είναι μόλις 1.7". Για κάτι τόσο απλό η java και τα threads είναι κάπως too much. Επίσης, επειδή κάποιος κάνει write κάτι δε σημαίνει ότι τα δεδομένα γράφονται αυτόματα και στον δίσκο καθώς μεσολαβούν αρκετά buffers.

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char *buf = NULL;
char characters&#91;&#93; = "0123456789abcdefghijklmnopqrstuvwxyz";

char *random_gen&#40;&#41;
&#123;
        buf&#91;0&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;1&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;2&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;3&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;4&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;5&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;6&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;7&#93; = characters&#91;rand&#40;&#41; % 35&#93;;
        buf&#91;8&#93; = '\0';

        return buf;
&#125;


int main&#40;void&#41;
&#123;
        int i;
        FILE *fp = fopen&#40;"data.txt", "w"&#41;;

        buf = &#40;char *&#41;malloc&#40;9 * sizeof&#40;char&#41;&#41;;
        if &#40;fp && buf&#41;
        &#123;
                srand&#40;time&#40;NULL&#41;&#41;;
                for &#40;i = 0; i < 1000000; i++&#41;
                        fprintf&#40;fp, "%s\n", random_gen&#40;&#41;&#41;;
                fclose&#40;fp&#41;;
        &#125;

        return EXIT_SUCCESS;
&#125;

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από cherouvim » 13 Ιούλ 2011 18:32

gvre έγραψε:Για κάτι τόσο απλό η java και τα threads είναι κάπως too much.
Ανάλογα τι θέλεις να κάνεις. Η δικιά μου έκδοση σε 1 second κάνει τη δουλειά (το χρόνο δεν τον αναφέρω για σύγκριση μιας και δεν έχουμε το ίδιο h/w και συνθήκες).

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

public static void main&#40;String&#91;&#93; args&#41; throws Exception &#123;
    PrintWriter w = new PrintWriter&#40;
            new BufferedOutputStream&#40;
            new FileOutputStream&#40;
            new File&#40;"data.txt"&#41;&#41;&#41;&#41;;
    for &#40;int i = 0; i < 1000000; i++&#41;
        w.println&#40;RandomStringUtils.random&#40;8, "0123456789abcdefghijklmnopqrstuvwxyz"&#41;&#41;;
    w.close&#40;&#41;;
&#125;

pimpogio
Δημοσιεύσεις: 1080
Εγγραφή: 28 Δεκ 2010 14:08

Πιο γρήγορα στρινγκς!

Δημοσίευση από pimpogio » 13 Ιούλ 2011 18:58

ποια lib ειναι αυτη που εχεις ?

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από cherouvim » 13 Ιούλ 2011 19:02


Άβαταρ μέλους
Rapid-eraser
WebDev Moderator
Δημοσιεύσεις: 6851
Εγγραφή: 05 Απρ 2003 17:50
Τοποθεσία: Πειραιάς
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από Rapid-eraser » 13 Ιούλ 2011 19:04

lol
Cu, Rapid-eraser, Tα αγαθά copies κτώνται.
Love is like oxygen, You get too much you get too high
Not enough and you're gonna die, Love gets you high

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από gvre » 13 Ιούλ 2011 19:18

cherouvim έγραψε:
gvre έγραψε:Για κάτι τόσο απλό η java και τα threads είναι κάπως too much.
Ανάλογα τι θέλεις να κάνεις. Η δικιά μου έκδοση σε 1 second κάνει τη δουλειά (το χρόνο δεν τον αναφέρω για σύγκριση μιας και δεν έχουμε το ίδιο h/w και συνθήκες).

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

public static void main&#40;String&#91;&#93; args&#41; throws Exception &#123;
    PrintWriter w = new PrintWriter&#40;
            new BufferedOutputStream&#40;
            new FileOutputStream&#40;
            new File&#40;"data.txt"&#41;&#41;&#41;&#41;;
    for &#40;int i = 0; i < 1000000; i++&#41;
        w.println&#40;RandomStringUtils.random&#40;8, "0123456789abcdefghijklmnopqrstuvwxyz"&#41;&#41;;
    w.close&#40;&#41;;
&#125;
Ωραίο παράδειγμα :)
Παρόλα αυτά στο δικό μου hw το παραπάνω θέλει 0.412s και αυτό που έγραψα σε C θέλει 0.176s. Αυτό όμως δε σημαίνει ότι πρέπει να το κάνει σε C.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από cherouvim » 13 Ιούλ 2011 19:19

gvre έγραψε:Αυτό όμως δε σημαίνει ότι πρέπει να το κάνει σε C.
Ναι. Τίποτα δεν σημαίνει. Εδώ δεν ξέρουμε τι πρόβλημα θέλει να λύσει. Κουβέντα να γίνεται.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από dva_dev » 13 Ιούλ 2011 19:21

Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP Προγραμματισμός
Τελικό συμπέρασμα είναι ότι ο βέλτιστος τρόπος για να γίνει αυτό που ζητείται είναι να μην χρησιμοποιηθεί ούτε php, ούτε mysql.

:P

gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από gvre » 13 Ιούλ 2011 19:27

dva_dev έγραψε:
Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP Προγραμματισμός
Τελικό συμπέρασμα είναι ότι ο βέλτιστος τρόπος για να γίνει αυτό που ζητείται είναι να μην χρησιμοποιηθεί ούτε php, ούτε mysql.

:P
LOL
Στο 1ο post που έκανα είχα ρωτήσει τον OP τι ακριβώς θέλει να κάνει. Τον ρώτησα και 2η φορά αλλά δε μας λέει :)

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από dva_dev » 13 Ιούλ 2011 19:43

Ισως θέλει να φτιάξει ένα random strings αρχείο για να πάρει τα hashes και να το δώσει σαν input στο aircrack_ng για να σπάσει το wifi της Μαιρούλας.
:D :hammer:

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Πιο γρήγορα στρινγκς!

Δημοσίευση από Christianago » 13 Ιούλ 2011 22:38

dva_dev έγραψε:Ισως θέλει να φτιάξει ένα random strings αρχείο για να πάρει τα hashes και να το δώσει σαν input στο aircrack_ng για να σπάσει το wifi της Μαιρούλας.
:D :hammer:
Κι αυτο δεν ειναι κακη ιδεα... :P Λεω να προσθεσουμε ενα μεγαλυτερο βαθμο δυσκολιας
στο διαγωνισμο που διαδραματιζεται απο οτι βλεπω και να μεγαλωσουμε τη συμβολοσειρα
ωστε να παιρνει και κεφαλαιους χαρακτηρες συν 5-6 βασικα συμβολα.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Πιο γρήγορα στρινγκς!

Δημοσίευση από cherouvim » 13 Ιούλ 2011 23:03

Christianago έγραψε:Λεω να προσθεσουμε ενα μεγαλυτερο βαθμο δυσκολιας
στο διαγωνισμο που διαδραματιζεται απο οτι βλεπω και να μεγαλωσουμε τη συμβολοσειρα
ωστε να παιρνει και κεφαλαιους χαρακτηρες συν 5-6 βασικα συμβολα.
Εννοείς απλά να προστεθούν οι χαρακτήρες στο παρακάτω;

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

char characters&#91;&#93; = "0123456789abcdefghijklmnopqrstuvwxyz";
Κάτι μας κρύβεις εσύ και προσπαθείς να μας παραπλανήσεις... :)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες