Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

  • Απαντ. 38
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Ποιο σου φαινεται καλυτερο;

 

>$q1 = "isnert into foo values('". mysql_real_escape_string($var1) . "','"
							. mysql_real_escape_string($var2) . "','"
							. mysql_real_escape_string($var3) . "','"
							. mysql_real_escape_string($var4) . "','"
							. mysql_real_escape_string($var5) . "','"
							. mysql_real_escape_string($var6) . "')";
							
$q2 = sprintf("inser into foo values('%s','%s','%s','%s','%s','%s')",
							mysql_real_escape_string($var1),
							mysql_real_escape_string($var2),
							mysql_real_escape_string($var3),
							mysql_real_escape_string($var4),
							mysql_real_escape_string($var5),
							mysql_real_escape_string($var6),

 

το δευτερο θεωρω εγωτωρα που το καταλαβα λιγο καλυτερα το ολο θεμα με την sprintf

Δημοσ.

Ίδια μου φαίνεται, απλώς θέλω να μάθω αν κάνω λάθος που τα θεωρώ ισοδύναμα.

 

Μεταξυ μας, και με custom string append να το εγραφα,παλι ιδιο θα σου φαινοταν happy.gif

Δημοσ.

Μεταξυ μας, και με custom string append να το εγραφα,παλι ιδιο θα σου φαινοταν happy.gif

Ρε συ, δεν έχω εμπεριστατωμένη επαφή με την php, οπότε απλώς ρώτησα αν υπάρχει κάποια διαφορά που θα πρέπει να γνωρίζω.

 

EDIT:

 

Λοιπόν, με ένα πρόχειρο googling: "php sprintf vs concatenation" τα πρώτα links που βγήκαν λένε πως για απλό concatenation χωρίς formatting, ο τελεστής . είναι ο πιο γρήγορος, και πως συγκριτικά με την sprintf() είναι περίπου 2 φορές ταχύτερος στην πλειοψηφία των περιπτώσεων...

 

1. http://judebert.com/...erformance.html

2. http://atomized.org/...best-practices/

3. http://stackoverflow...trings-together

 

δείχνουν επίσης μερικούς ακόμα τρόπους για ένωση strings.

Δημοσ.

εχεις καποια Links αξιολογα υποψην???

 

http://www.php.net/manual/en/pdo.connections.php, διάβασε όλα τα βασικά examples και μη γυρίσεις ποτέ πίσω.

 

Λοιπόν, με ένα πρόχειρο googling: "php sprintf vs concatenation" τα πρώτα links που βγήκαν λένε πως για απλό concatenation χωρίς formatting, ο τελεστής . είναι ο πιο γρήγορος, και πως συγκριτικά με την sprintf() είναι περίπου 2 φορές ταχύτερος στην πλειοψηφία των περιπτώσεων...

 

...ναι αλλά αυτό είναι κλασική περίπτωση premature optimization όπου βλέπεις το δέντρο (τρέχει μια ανάσα γρηγορότερα, τόσο που αν δε το βάλεις μέσα σε ένα loop 10K iterations η διαφορά δε θα είναι μετρήσιμη) και χάνεις το δάσος (readability/maintainability).

 

Στην τελική αν πραγματικά σ' ενδιαφέρει η ταχύτητα είτε χρησιμοποιείς ένα extension που κάνει opcode caching όπως το APC ή αν θέλεις πραγματικά να το χοντρύνεις γιατί είσαι π.χ. το Facebook γράφεις έναν compiler από PHP σε C.

 

Συγχωρεμένος γιατί όπως λες και συ δεν είσαι PHPας ;)

 

ΥΓ: Για να μην παρεξηγηθώ: δε διαφωνώ ότι με interpolation είναι πιο γρήγορο. Διαφωνώ ότι αυτός είναι ικανός λόγος να κάνεις interpolation στη συγκεκριμένη περίπτωση (και στο 99% των περιπτώσεων γενικότερα).

Δημοσ.

Η επαφή μου με την PHP είναι περιστασιακή (όπως έγραψα και πριν) αλλά αν αληθεύει πως ο τελεστής . είναι συνήθως 2 φορές πιο γρήγορος από την sprintf() τότε το readability πάει αυτόματα σε 2η μοίρα (άλλωστε δεν υπάρχει δραματική διαφορά readability μεταξύ των 2 μεθόδων).

 

Αυτά που αναφέρεις περί opcode caching, APC extensions, interpolation, κλπ δεν έχω την παραμικρή ιδέα τι είναι, τι σημαίνουν και τι κάνουν :lol: (θα τα θυμάμαι όμως να τα κοιτάξω στο google αν χρειαστεί να ασχοληθώ με ένωση strings στην php).

Δημοσ.

Η επαφή μου με την PHP είναι περιστασιακή (όπως έγραψα και πριν) αλλά αν αληθεύει πως ο τελεστής . είναι συνήθως 2 φορές πιο γρήγορος από την sprintf() τότε το readability πάει αυτόματα σε 2η μοίρα (άλλωστε δεν υπάρχει δραματική διαφορά readability μεταξύ των 2 μεθόδων).

 

Μπορούμε λοιπόν να συμφωνήσουμε πως διαφωνούμε.

 

Για μένα υπάρχει διαφορά σε readability η οποία γίνεται τόσο μεγαλύτερη όσο πιο περίπλοκη η expression που θέλεις να εισάγεις (δοκίμασε π.χ. "a".1+1."b" για μια δυσάρεστη έκπληξη). Αυτό βέβαια είναι υποκειμενικό.

 

Αυτό που είναι αντικειμενικό όμως είναι η διαφορά στην ταχύτητα για την οποία μιλάς. Κάνε ένα benchmark αν θέλεις χωρίς loop για να διαπιστώσεις ότι δε θα υπάρξει καμία απολύτως μετρήσιμη διαφορά. Διαφορά σε συνθετικά benchmarks != διαφορά στην πράξη. :rolleyes:

 

Για τα υπόλοιπα που αναφέρω: πες ότι αυτό που συζητάμε είναι το πώς θα κάνουμε ένα αμάξι να πάει γρηγορότερα. Αυτά που είπα είναι το αντίστοιχο του να αλλάξουμε το σασί με ένα πιο σπορ, και το interpolation vs sprintf είναι το αντίστοιχο του αν πρέπει να κάνουμε τρύπες στα πεντάλ για να γλυτώσουμε βάρος.

Δημοσ.

Γιατί μπορεί π.χ. να θέλεις να κάνεις interpolate κάτι που είναι αποτέλεσμα πράξεων.

 

To point μου είναι ότι στην PHP π.χ. το "a".2."b" δεν κάνει compile ενώ το "a".(2)."b" κάνει. Αν σου πέσαν τα μαλλιά τότε έχεις σώας τας φρένας σου... PHP, μην την ψάχνεις. :-D

 

Αν λοιπόν θέλεις να κάνεις interpolate κάτι τέτοιο πρέπει να του φορέσεις παρενθέσεις (ενώ αν το βάλεις σαν παράμετρο στη sprintf δε χρειάζεται "ειδική μεταχείριση"). Υπάρχουν πολλά τέτοια αηδιαστικά στη γλώσσα.

Δημοσ.

Η επαφή μου με την PHP είναι περιστασιακή (όπως έγραψα και πριν) αλλά αν αληθεύει πως ο τελεστής . είναι συνήθως 2 φορές πιο γρήγορος από την sprintf() τότε το readability πάει αυτόματα σε 2η μοίρα (άλλωστε δεν υπάρχει δραματική διαφορά readability μεταξύ των 2 μεθόδων).

 

Αφενός πόσο time critical θα είναι αυτό που θα κάνεις σε PHP και αφετέρου πόσο πια θα κερδίσεις σε αυτή την περίπτωση ? Στους κώδικες για C που δίνεις, συχνά βλέπω να έχεις 'printf("τάδε")'. Με αυτό το σκεπτικό δεν θα έπρεπε να βάζεις 'puts("τάδε")' γιατί το processing που κάνει η printf είναι πολύ αργό ? (παραβλέπουμε optimizations του compiler)

 

Αν δεν μιλάμε για τεράστια διαφορά στην ταχύτητα, τότε readability > all

Δημοσ.

Αν δεν μιλάμε για τεράστια διαφορά στην ταχύτητα, τότε readability > all

 

Σταμάτα να συμφωνείς, θα φάμε ban για διατήρηση διπλού account. :-D

Δημοσ.

Γιατί μπορείς να θέλεις να κάνεις interpolate κάτι που είναι αποτέλεσμα πράξεων.

 

To point μου είναι ότι στην PHP π.χ. το "a".2."b" δεν κάνει compile ενώ το "a".(2)."b" κάνει. Αν σου πέσαν τα μαλλιά τότε έχεις σώας τας φρένας σου... PHP, μην την ψάχνεις. :-D

 

Αν λοιπόν θέλεις να κάνεις interpolate κάτι τέτοιο πρέπει να του φορέσεις παρενθέσεις κλπ κλπ. Υπάρχουν πολλά τέτοια αηδιαστικά στη γλώσσα.

 

Το "a".(2)."b" παράγει string δηλαδή; Δεν ξέρω καν τι παράγει αυτό το expression (επίσης δεν ξέρω τι σημαίνει interpolation στο context της php).

 

Αρχικά νόμιζα πως είχε κάτι να κάνει προτεραιότητα τελεστών (νομίζω πως το + προηγείται του . ) και ήμουν έτοιμος να απαντήσω πως κάτι αντίστοιχο ισχύει και με την sprintf(), π.χ...

 

>
sprintf( $s, "%d", 1+2*3);

παράγει διαφορετικό $s συγκριτικά με το...

 

>sprintf( $s, "%d", (1+2)*3);

 

αλλά νομίζω πως μιλάς για τελείως διαφορετικό πράγμα.

 

EDIT:

 

Αφενός πόσο time critical θα είναι αυτό που θα κάνεις σε PHP και αφετέρου πόσο πια θα κερδίσεις σε αυτή την περίπτωση ? Στους κώδικες για C που δίνεις, συχνά βλέπω να έχεις 'printf("τάδε")'. Με αυτό το σκεπτικό δεν θα έπρεπε να βάζεις 'puts("τάδε")' γιατί το processing που κάνει η printf είναι πολύ αργό ? (παραβλέπουμε optimizations του compiler)

Και όμως το συγκεκριμένο το δίνω με puts(). Αν μου 'χει ξεφύγει κανένα με printf() τότε θα είναι εκ παραδρομής :)

 

Αν δεν μιλάμε για τεράστια διαφορά στην ταχύτητα, τότε readability > all

Μιλάνε για 2 φορές πιο αργή η sprintf() ... προσωπικά δεν ξέρω, δεν το έχω μετρήσει.

Δημοσ.

Ναι, το "a".(2)."b" παράγει το string "a2b".

 

To "a".(1+1)."b" επίσης παράγει το ίδιο.

 

Όμως το "a".1+1."b" δεν κάνει compile. Το ίδιο και το "a".2."b".

 

Από την άλλη, αυτό κάνει compile:

>
$a = 1;
$b = 2;
echo "a".$a+$b."b";

 

...αλλά η έξοδος που παράγει είναι σκέτο "2b".

 

Όπως είπα, α) μην την ψάχνεις και β) concatenation: don't go there εκτός κι αν μιλάμε για trivial περιπτώσεις.

 

By the way, λάθος ορολογία εκ μέρους μου:

>
$foo = "foo";
echo "Hello ".$foo; // σωστός όρος: concatenation
echo "Hello $foo"; // σωστός όρος: interpolation

 

To interpolation είναι ο γρηγορότερη μέθοδος, αλλά θέλει και τα περισσότερα κόλπα. Δίνω μερικά παραδείγματα για το πως πρέπει να γράψεις τις εκφράσεις για να έχουν ισοδύναμο αποτέλεσμα:

 

>printf("Total = %s", $a + $;
echo "Total = ".($a+$; // concat: θέλει παρενθέσεις
// interpolation: δε γίνεται

printf("Total = %s", $array['index']);
echo "Total = ".$array['index']; // concat
echo "Total = $array[index]";// interpolation: πρέπει να βγάλεις τα αυτάκια...
// αυτό όμως (χωρίς αυτάκια) δίνει E_NOTICE και αν είσαι πραγματικά άτυχος δε θα δουλέψει καν!
echo $array[index];

printf("You have the %dth position", $pos);
echo "You have the ".$pos."th position"; // concat
echo "You have the {$pos}th position"; // interpolation: μη ξεχάσεις curly braces...

Προσωπικά δεν το απολαμβάνω να μαζοχίζομαι με τις παραξενιές της PHP. Εφόσον ο κώδικας δεν είναι time critical (αν είναι: χρησιμοποιείς λάθος γλώσσα) ας τον γράψουμε με τρόπο που δε θα μας κάνει να τραβάμε ο,τι προεξέχει.

 

Μιλάνε για 2 φορές πιο αργή η sprintf() ... προσωπικά δεν ξέρω, δεν το έχω μετρήσει.

 

Ναι, δε διαφωνεί κανείς μ' αυτό. Απλά λέμε ότι 2 φορές πιο αργή στην πράξη σημαίνει 2nsec αντί για 1, οπότε το request σα σύνολο θα πάρει π.χ. 200001 nsec αντί για 200000.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...