Za pomocą PHP jaki jest najszybszy sposób na konwersję takiego ciągu: "123"
na liczbę całkowitą?
Dlaczego ta metoda jest najszybsza? Co się stanie, jeśli otrzyma nieoczekiwane dane wejściowe, takie jak "hello"
tablica?
php
optimization
casting
pseudonim
źródło
źródło
(int)
iintval()
może wynosić ponad 400%!Odpowiedzi:
Właśnie skonfigurowałem szybkie ćwiczenie porównawcze:
Wywołanie intval () jest średnio dwa i pół raza wolniejsze, a różnica jest największa, jeśli dane wejściowe są już liczbą całkowitą.
Chciałbym wiedzieć, dlaczego .
Aktualizacja: Ponownie uruchomiłem testy, tym razem z przymusem
(0 + $var)
Dodatek: Właśnie natknąłem się na nieco nieoczekiwane zachowanie, o którym powinieneś wiedzieć wybierając jedną z tych metod:
Testowane przy użyciu PHP 5.3.1
źródło
+"15" == 15
(int)
iintval
, w każdej parze, podaje%intval
, podstawową sprawą musi być(int)
. Ale masz rację, że byłoby wyraźniej, gdyby powiedział to wprost, zwłaszcza, że później dodał trzeci przypadek!Osobiście uważam, że casting jest najładniejszy.
Jeśli zostanie wysłany ciąg typu „Witaj”, zostanie on rzutowany na liczbę całkowitą 0. W przypadku ciągu takiego jak „22 lata” zostanie on rzutowany na liczbę całkowitą 22. Wszystko, czego nie może parsować na liczbę, ma wartość 0.
Jeśli naprawdę POTRZEBUJESZ prędkości, myślę, że pozostałe sugestie są poprawne, zakładając, że przymus jest najszybszy.
źródło
Uruchom test.
To był test, który przeprowadził każdy scenariusz 10 000 000 razy. :-)
Koercja jest
0 + "123"
Casting jest
(integer)"123"
Myślę, że Co-ercion jest trochę szybszy. Aha, a próba
0 + array('123')
jest krytycznym błędem w PHP. Możesz chcieć, aby Twój kod sprawdzał typ podanej wartości.Mój kod testowy znajduje się poniżej.
źródło
settype
do tego testu i uruchomiłem go przy użyciu PHP 7. Rzutowanie wyszło nieco z przodu i duża poprawa wydajności w stosunku do wszystkich: przymus ciągów: 1,9255340099335 ciąg rzutów: 1,5142338275909 typ ciągów: 4.149735212326 przymus ciągów niepowodzeń: 1.2346560955048 ciąg niepowodzeń rzutów: 1,3967711925507 porażka ciągów settype: 4.149735212326Możesz po prostu przekonwertować długi ciąg znaków na liczbę całkowitą za pomocą FLOAT
$float = (float)$num;
Lub jeśli chcesz, żeby liczba całkowita nie była zmienną, to idź z
$float = (int)$num;
Np.
źródło
(int)
? Może być prawdą, że jeśli łańcuch zawiera liczbę całkowitą, to(float)
zwróci wartość, która działa podobnie jak liczba całkowita (nawet jeśli jego wewnętrzny typ jest prawdopodobniefloat
), ale dlaczego miałbyś to zrobić, jeśli specyfikacja ma zwrócić wartość całkowitą ? Załóżmy, że ciąg przychodzący to „1.3”? Nie dostaniesz liczby całkowitej. Również ze względu na każdego, kto czyta kod w przyszłości, powinieneś powiedzieć, co masz na myśli. Jeśli masz na myśli „powinna to być liczba całkowita”, powiedz(int)
nie(float)
.źródło
liczba całkowita wyciąg z dowolnego ciągu
$ in = „tel.123-12-33”;
// $ out = '1231233';
źródło
Więcej wyników testu ad hoc:
źródło
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Ryzykowne jest także"-11"
bezpośrednie użycie wartości dosłownej , chyba że masz pewność, że język nie wykona części pracy w czasie kompilacji. Prawdopodobnie OK dla dynamicznego języka takiego jak PHP, ale wspominam o tym w przyszłości, jeśli testujemy formuły w innych językach. Bezpieczniej jest ustawić zmienną$x = "-11"
przed pętlą testową, a następnie użyć jej. Tak więc wewnętrzny kod jest$i =+$x
.Przeprowadziłem test porównawczy i okazuje się, że najszybszym sposobem uzyskania prawdziwej liczby całkowitej (przy użyciu wszystkich dostępnych metod) jest
Po prostu używam
zwraca liczbę zmiennoprzecinkową.
źródło
(int)"12.345"
? Szybciej o jaki procent?