Na początek mały test pokazujący różnice pomiędzy pustymi sprintf, "" oraz ''.
Sprintf: 5.5083110332 " ": 1.8283259869 ' ': 1.7890319824
oraz sam test dla "" i '':
" ": 1.1731438637 ' ': 1.1480429173 " ": 1.1413729191 ' ': 1.1829788685
Jak widać różnice w wydajności pomiędzy "" a '' są praktycznie nieistniejące, natomiast sprintf wykonuje się 3 razy dłużej.
Porównajmy zatem wydajność przy dołączaniu tekstu zapisanego w zmiennej pomiędzy inne elementy.
Sprintf: 7.5031311511993 " "." ": 2.9455320835114 " ": 3.1112060546875 { }: 3.1566998958588
Wyniki te kolejno odnoszą się do kodu:
$temp = sprintf("prefix %s postfix",$text); $temp = "prefix ".$text." postfix"; $temp = "prefix $text postfix"; $temp = "prefix {$text} postfix";
Okazuje się, że najszybciej działa łączenie kolejnych niezależnych ciągów, następnie w szeregu wydajności znajdują się metody "na skróty", a na końcu wywołanie funkcji sprintf.
Na sam koniec zostawiłem porównanie wydajności rzutowań na typy liczbowe - integer i float. Wyniki prezentują się następująco:
Sprintf %d: 0.7861609459 666 Sprintf %u: 0.7842721939 666 Sprintf %f: 1.2757029533 666.999000 (int): 0.2504780293 666 (float): 0.2895848751 666.999
Funkcja sprintf znowu jest trzykrotnie, a w przypadku rzutowania na float ponad czterokrotnie wolniejszy. Jednak sytuacja ta zmienia się diametralnie gdy zaczynamy tworzyć ciąg składający się z wielu zmiennych:
Sprintf %d %f: 6.8353290558 Sprintf %1$d %2$f: 7.3985271454 (int), (float) 8.1965639591
Wyniki te odpowiadają kodowi:
$temp = sprintf("%d %f %d",$numeric, $float, $int); $temp = sprintf('%1$d %2$f %3$d',$numeric, $float, $int); $temp = (int)$numeric." ".(float)$float." ".(int)$int;
Przy tworzeniu rozbudowanych ciągów tekstowych jednak warto użyć funkcji sprintf. Jednak z drugiej strony przy pojedynczych zmiennych o wiele lepiej używać bezpośredniego rzutowania. To na co również warto zwrócić uwagę to fakt, że odnoszenie się do zmiennych poprzez %1$, %2$ itd. mimo iż jest z pewnością szybsze do napisania to jednak działa nieco wolniej od bezpośredniego podawania każdego z parametrów (nawet jeśli musimy je podawać wielokrotnie w jednym wywołaniu funkcji).
Wykorzystany kod do testowania można pobrać jak zwykle z mojego chomika (link).
Brak komentarzy:
Prześlij komentarz