Menggunakan PHP, apa cara tercepat untuk mengonversi string seperti ini: "123"
ke integer?
Mengapa metode khusus itu paling cepat? Apa yang terjadi jika mendapat input yang tidak terduga, seperti "hello"
atau array?
php
optimization
casting
nickf
sumber
sumber
(int)
danintval()
bisa lebih dari 400%!Jawaban:
Saya baru saja membuat latihan pembandingan cepat:
Rata-rata, panggilan intval () dua setengah kali lebih lambat, dan perbedaannya adalah yang terbesar jika input Anda sudah bilangan bulat.
Saya tertarik untuk tahu mengapa .
Pembaruan: Saya sudah menjalankan tes lagi, kali ini dengan paksaan
(0 + $var)
Tambahan: Saya baru saja menemukan perilaku yang sedikit tidak terduga yang harus Anda perhatikan ketika memilih salah satu dari metode ini:
Diuji menggunakan PHP 5.3.1
sumber
+"15" == 15
(int)
danintval
, dan pada masing-masing pasangan, memberikan% onintval
, case dasar harus(int)
. Tetapi Anda memiliki poin yang bagus bahwa akan lebih jelas jika dia mengatakannya secara eksplisit, terutama karena ia kemudian menambahkan kasus ketiga!Saya pribadi merasa casting adalah yang tercantik.
Jika string seperti 'Hello' dikirim, itu akan dilemparkan ke integer 0. Untuk string seperti '22 tahun ', itu akan dilemparkan ke integer 22. Apa pun yang tidak dapat diuraikan ke angka menjadi 0.
Jika Anda benar-benar MEMBUTUHKAN kecepatan, saya kira saran lain di sini benar dalam mengasumsikan bahwa pemaksaan adalah yang tercepat.
sumber
Jalankan tes.
Ini adalah tes yang menjalankan setiap skenario 10.000.000 kali. :-)
Koersi adalah
0 + "123"
Casting adalah
(integer)"123"
Saya pikir Co-ercion sedikit lebih cepat. Oh, dan mencoba
0 + array('123')
adalah kesalahan fatal dalam PHP. Anda mungkin ingin kode Anda memeriksa jenis nilai yang disediakan.Kode pengujian saya di bawah.
sumber
settype
ke tes ini dan menjalankannya menggunakan PHP 7. Cast keluar sedikit di depan dan peningkatan kinerja besar atas semua: string coerce: 1.9255340099335 string pemain: 1.5142338275909 string settype: 4.149735212326 string fail coerce: 1.2346560955048 string fail cast: 1.3967711925507 gagal settype: 4.149735212326Anda bisa mengubah string panjang menjadi integer dengan menggunakan FLOAT
$float = (float)$num;
Atau jika Anda ingin integer tidak mengambang val kemudian pergi bersama
$float = (int)$num;
Misalnya
sumber
(int)
? Mungkin benar bahwa jika string berisi bilangan bulat, itu(float)
akan mengembalikan nilai yang banyak bertindak seperti bilangan bulat (meskipun jenis internalnya mungkinfloat
), tetapi mengapa Anda melakukan ini, jika spesifikasinya adalah mengembalikan nilai integer ? Misalkan string yang masuk adalah "1.3"? Anda tidak akan mendapatkan bilangan bulat. Juga, demi siapa pun yang membaca kode di masa mendatang, Anda harus mengatakan apa yang Anda maksud. Jika Anda maksudkan "itu harus bilangan bulat", maka katakan(int)
, tidak(float)
.sumber
integer excract dari sembarang string
$ in = 'tel.123-12-33';
// $ out = '1231233';
sumber
Lebih banyak hasil benchmark ad-hoc:
sumber
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Juga berisiko menggunakan nilai literal"-11"
secara langsung, kecuali jika Anda yakin bahasanya tidak akan melakukan beberapa pekerjaan pada waktu kompilasi. Mungkin OK untuk bahasa dinamis seperti PHP, tetapi saya menyebutkan untuk referensi di masa depan jika menguji rumus dalam bahasa lain. Lebih aman untuk mengatur variabel$x = "-11"
sebelum loop tes, dan kemudian menggunakannya. Sehingga kode bagian dalamnya$i =+$x
.Berlari patokan, dan ternyata cara tercepat untuk mendapatkan bilangan bulat nyata (menggunakan semua metode yang tersedia) adalah
Hanya menggunakan
mengembalikan pelampung.
sumber
(int)"12.345"
? Lebih cepat berapa persen?