Sau khi sử dụng PHP được một lúc, tôi nhận thấy rằng không phải tất cả các hàm PHP tích hợp đều nhanh như mong đợi. Hãy xem xét hai triển khai có thể có của một hàm tìm thấy nếu một số là số nguyên tố bằng cách sử dụng một mảng các số nguyên tố được lưu trữ.
//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
$result_array[$number] = in_array( $number, $large_prime_array );
}
//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) {
$result_array[$number] = array_key_exists( $number, $large_prime_array );
}
Điều này là do in_array
được thực hiện với tìm kiếm tuyến tính O (n) sẽ chậm tuyến tính khi $prime_array
phát triển. Trường hợp array_key_exists
hàm được thực hiện với tra cứu băm O (1) sẽ không bị chậm lại trừ khi bảng băm trở nên cực kỳ đông dân (trong trường hợp đó chỉ là O (n)).
Cho đến nay tôi đã phải khám phá các big-O thông qua thử nghiệm và lỗi, và thỉnh thoảng nhìn vào mã nguồn . Bây giờ cho câu hỏi ...
Có một danh sách các thời gian O lớn về mặt lý thuyết (hoặc thực tế) cho tất cả * các hàm PHP tích hợp không?
* hoặc ít nhất là những người thú vị
Ví dụ, tôi thấy nó rất khó để dự đoán O lớn các chức năng được liệt kê bởi vì việc thực hiện có thể phụ thuộc vào cấu trúc dữ liệu cốt lõi không rõ của PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(với đầu vào mảng) vv
true
và sau đó kiểm tra sự hiện diện bằng cách sử dụng isset($large_prime_array[$number])
. Nếu tôi nhớ chính xác, nó sẽ nhanh hơn hàng trăm lần so với in_array
chức năng.
array_key_exists
, tôi đang so sánh với in_array
. in_array
Lặp lại từng mục trong mảng và so sánh giá trị với kim mà bạn truyền cho nó. Nếu bạn lật các giá trị sang khóa (và chỉ thay thế từng giá trị bằng giá trị giả như thế true
, thì việc sử dụng isset
sẽ nhanh hơn nhiều lần. Điều này là do các khóa của một mảng được PHP lập chỉ mục (như hàm băm). một mảng theo cách này có thể có một sự cải thiện đáng kể về tốc độ.