sprintf

Door Kris Peeters, 7 jaar geleden, 9.754x bekeken

Sprintf komt uit de programmeerwereld. Het is een vrij oude functie.
Ooit, toen men console-programma's schreef in C was printf (zowel printf als sprinf bestaan) bijna de enige manier om een string op het scherm te krijgen.
Die functie is overgenomen door php en is nog steeds heel nuttig.

Gesponsorde koppelingen

Inhoudsopgave

  1. Hello World
  2. Getallen
  3. Toegepast

 

Er zijn 10 reacties op 'Sprintf'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jeroen VD
Jeroen VD
7 jaar geleden
 
0 +1 -0 -1
wat een leuke functie! al vind ik zelf (overtuig me als je dat niet zo vindt) dat de enige echt nuttige toepassing SQL is... al is het zo dat als je een nette manier van je SQL opschrijven hanteert je voor dit nut sprintf() niet nodig hebt voor leesbaarheid, getallen komt de leesbaarheid ten goede als je gewoon in de string afrondingsfuncties gebruikt en voor woorden in een string echoen is vrij omslachtig vind ik.

maar dat is mijn mening, wat vindt de rest?
Ger van Steenderen
Ger van Steenderen
7 jaar geleden
 
0 +1 -0 -1
De sprintf functie kan in een aantal situaties vrij nuttig zijn.
@Jeroen
Ik ga het omdraaien, geef jij nu eens situaties aan waarin het NIET nuttig is.

@Kris, goeie duidelijke tutorial
Ozzie PHP
Ozzie PHP
7 jaar geleden
 
0 +1 -0 -1
"Ik ga het omdraaien, geef jij nu eens situaties aan waarin het NIET nuttig is."

Voor het overzicht is het een hele mooie functie. Echter, hou er wel rekening mee dat (s)printf een trage functie is. Stel dat je bijv. 30 producten op een pagina hebt staan, dan kun je beter dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'Eigenschappen van ' . $product_name;
?>

... in plaats van

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
printf('Eigenschappen van %s', $product_name);
?>

(s)printf is namelijk significant trager en dat gaat ten koste van je performance.
Willem vp
Willem vp
7 jaar geleden
 
0 +1 -0 -1
Alhoewel "echo sprintf" niet fout is, kijk ik toch altijd even bedenkelijk als ik dergelijke code zie. Wat is er mis met een simpele printf? ;-)

Overigens staat de s niet voor 'stream' maar voor 'string'.
Ozzie PHP
Ozzie PHP
7 jaar geleden
 
0 +1 -0 -1
"Wat is er mis met een simpele printf? ;-)"

Daar heb je dan inderdaad wel een goed punt ;) Ik heb het aangepast, maar blijft onverlet dat (s)printf een stukje trager is dan concat (het aan elkaar plakken van strings en variabelen).

Voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$kat
     = 'kat';
$krullen = 'krullen';
$trap    = 'trap';

// Optie 1
echo 'De ' . $kat . ' krabt de ' . $krullen . ' van de ' . $trap . '<br>';

// Optie 2
printf('De %s krabt de %s van de %s<br>', $kat, $krullen, $trap);

?>

Verwerkingstijd bij 5.000 loops:

Optie 1: 0,00662 sec.
Optie 2: 0,01167 sec.
Willem vp
Willem vp
7 jaar geleden
 
0 +1 -0 -1
Ozzie, als je je voorbeeld zie, krijg ik het beeld van een Zwitsers zakmes waarvan je alleen het schroevendraaiertje gebruikt. printf() kan natuurlijk veel meer. Wanneer je formats als %-20s of %5.5s gaat gebruiken, wordt het al een stuk lastiger (en waarschijnlijk ook een stuk trager) om dat met een simpele echo te doen.

Als het je om die paar microseconden snelheidswinst gaat (hoor ik daar het woord "micro-optimalisatie" weer? ;-) ) dan ben je trouwens ook verkeerd bezig bij je echo. Je moet dan niet concateneren, maar meerdere parameters opgeven (dus komma's gebruiken in plaats van punten). Overigens ontkracht je met je metingen je eerdere opmerking dat printf "significant trager" is. 1.3 t.o.v. 2.3 microseconden per aanroep kan ik nou niet bepaald een significant verschil noemen.

En het is niet altijd (beter gezegd: meestal juist niet) de snelheid die de doorslag geeft of je echo/print gebruikt dan wel (s)printf, maar programmeerstijl. Als je net een serie printf-statements hebt geschreven, valt een echo erg uit de toon. In het kader van consistentie kun je dan beter doorgaan met printf.
Ozzie PHP
Ozzie PHP
7 jaar geleden
 
0 +1 -0 -1
Uiteraard hangt het van meerdere factoren af, maar er werd gevraagd waarom je (s)printf niet zou gebruiken. Nou, de factor snelheid zou dus een overweging kunnen zijn. Maar je hebt het dan inderdaad over micro-optimalisatie. In het voorbeeld dat ik gaf voegt printf niet iets extra's toe. Het is zelfs iets trager dan een echo met concat. In zo'n geval kun je dus zeggen dat het niet nuttig is. Maar goed, overzichtelijke code kan dan weer een reden zijn om het wel te gebruiken. Het ging me er alleen even om om te laten zien wat een mogelijke keerzijde is. Overigens grappig... komma's gebruiken ipv punten in een echo. Ik heb dit zelf nooit gedaan, maar het schijnt inderdaad sneller te zijn. Wel vraag ik me af... als het sneller is, waarom doet niemand het dan? Zou dat vanwege de leesbaarheid zijn, of misschien onwetendheid?
Kris Peeters
Kris Peeters
7 jaar geleden
 
0 +1 -0 -1
@ Willem vp
Ik wou een tutorial maken over sprintf. sprintf is interessant net omdat het het resultaat returnt en niet rechtstreeks op het scherm zet, zoals printf dat wel doet.
Nu ja, ik zal toch maar melden men printf het resultaat geeft dat echo sprintf geeft.

@ argumenten over de snelheid...
Kan iemand verifiëren of het volgende waar is?
Volgens mij gebruiken een hoop php-funties over string-manipulatie intern sprintf. Number_format en dat soort functies; misschien ook de escape-functies ...
Dus zelfs wanneer je denkt dat je sprintf niet gebruikt, wordt ze waarschijnlijk toch vaak uitgevoerd.
Willem vp
Willem vp
7 jaar geleden
 
0 +1 -0 -1
In de PHP-sources wordt inderdaad veelvuldig gebruik gemaakt van sprintf; in de source-boom kom ik ongeveer 1900 aanroepen tegen. Daarbij wil ik wel opmerken dat dat de C-variant van sprintf betreft; qua performance hoeft die niet vergelijkbaar te zijn met PHP.

Betreffende "echo sprintf" moet je je wel realiseren dat mensen dingen na gaan doen als ze in een tutorial staan. Ik zou er zelf dan ook eerder voor kiezen om de code te schrijven als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$str = sprintf(...);
echo "De gegenereerde string is: $str";

Dat maakt het m.i. duidelijker wat sprintf doet.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Wouter J
Wouter J
7 jaar geleden
 
0 +1 -0 -1
Nog een leuke:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$dateString
= sprintf(
    "%'02d-%'02d-%d",
    $gbdag,
    $gbmaand,
    $gbjaar
);
?>


Zonder sprintf zou dit zoiets worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$dateString
= str_pad($gbdag, 2, '0', STR_PAD_LEFT).'-'.str_pad($gbmaand, 2, '0', STR_PAD_LEFT).'-'.$gbjaar;
?>

Om te reageren heb je een account nodig en je moet ingelogd zijn.

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.