Đối tượng php so với mảng kết hợp

một nhà xây dựng là gì?

Kết quả (càng nhỏ càng tốt)

Đó là kết quả của điểm chuẩn tính bằng giây

Đối tượng php so với mảng kết hợp

Loại.  

  • [-]

    crodas (25)
      

    Tôi luôn bắt đầu với các mảng để tạo mẫu nhanh, sau đó tôi quay lại các đối tượng để lưu trữ cùng một dữ liệu. Không chỉ vì tôi nghi ngờ nó sẽ nhanh hơn (vì định nghĩa lớp) mà còn vì dữ liệu tôi đang chia sẻ có các phương thức riêng biết cách xử lý dữ liệu đó. Đây là một ví dụ mà tôi đã chuyển các cấu trúc mảng vào lớp riêng của chúng, mã đẹp hơn nhiều và nó chạy nhanh hơn một chút nếu bạn đo vài triệu lần

    Bài viết thú vị xác nhận lý thuyết của tôi. D, cảm ơn vì đã viết nó

    $0. 00

    • + tiếng kêu

    Hồi đáp

    [-]

    crell (53)
      

    Tốt đẹp. Vâng, khả năng đóng gói hành vi là một trong những lợi ích rõ ràng nhất của một lớp nhưng có một niềm tin chung về PHP trong nhiều năm rằng làm như vậy sẽ tốn kém hơn so với làm "thủ công". Điều đó có thể đúng một lần, nhưng nó chắc chắn không đúng ngày hôm nay. Trong thực tế, hoàn toàn ngược lại

    $0. 00

    Hồi đáp

    [-]

    crell (53)
      

    Một phụ lục, như một vài người đã chỉ ra cho tôi trên Twitter

    Điều này áp dụng cho hành vi thời gian chạy. PHP có một cách tối ưu hóa khác, nếu bạn xác định một mảng là

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    4 thì nó sẽ được đặt trong bộ nhớ dùng chung với mã, do đó, chi phí bộ nhớ thực cho mỗi quá trình sử dụng mảng đó là 0

    Điều đó thực sự chỉ áp dụng nếu

    • Bạn được tạo mã biên dịch
    • Mảng được biên dịch chỉ chứa vô hướng và mảng (không có đối tượng hoặc bao đóng)
    • Mảng đã biên dịch sẽ không bao giờ bị sửa đổi khi chạy

    Trong trường hợp đó, một mảng lồng nhau lớn

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    4 thực sự có thể tốt hơn cho cả CPU và bộ nhớ

    Tuy nhiên, trình tạo thời gian chạy cho mã đã biên dịch đó vẫn tốt hơn khi sử dụng các đối tượng để đạt hiệu quả bộ nhớ để bạn có thể tạo mã đã biên dịch đó

    Như mọi khi, bối cảnh quan trọng. . -)

    $0. 00

    • + tiếng kêu

    Hồi đáp

    [-]

    lukestokes (75)
      

    Viết hay quá, Larry. tôi sẽ không chiến đấu với bạn. Bạn đã lập luận tốt

    $0. 00

    Hồi đáp

    [-]

    crell (53)
      

    ồ tốt. Chúng ta có đủ thứ để đấu tranh. Tôi ghét phải thêm tối ưu hóa lập trình vào danh sách. . -)

    $0. 00

    Hồi đáp

    [-]

    shulard (25)
      

    Điểm chuẩn đẹp

    Và còn việc mở rộng

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    6 trên lớp đã đặt tên để vẫn lưu trữ nó dưới dạng một mảng kết hợp thì sao?

    Nó có phải là sự kết hợp đôi bên cùng có lợi nhất không?

    $0. 00

    Hồi đáp

    [-]

    crell (53)
      

    Tôi đoán là nó sẽ chậm hơn vì nó phải gọi tuần tự hóa/giải tuần tự hóa trong không gian người dùng cho mỗi lớp. Nó có thể sẽ nhỏ hơn nhưng chi phí hiệu suất có thể không đáng. Điều đó nói rằng, tôi đã không thử

    $0. 00

    Hồi đáp

    [-]

    brooksie155 (25)
      

    Làm thế nào về việc sử dụng array_multisort() thay vì usort()

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    ksort($list);
    
    usort($list, function($first, $second) {
      return [$first['a'], $first['b']] <=> [$second['a'], $second['b']];
    });
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\n", $stop - $start, $memory);
    
    0

    Chạy trên mac book pro, 2. Intel Core i7 2GHz, 16GB, liệt kê Av. của 3 lần chạy

    Mảng kết hợp (Sắp xếp)

    MethodRuntime(s)Memory (byte)usort15. 6589 (s)541414232 byte (516. 33 MB)array_mulitsort8. 8314 (s)706785816 byte (674. 04MB)

    Đối tượng có thuộc tính công khai (sắp xếp)

    MethodRuntime(s)Memory (byte)usort12. 9263 (s)253795352 byte (242. 04 MB)array_mulitsort7. 6217 (s)419166808 byte (399. 75MB)

    sự đánh đổi giữa bộ nhớ và thời gian chạy

    $0. 00

    • và 1 nữa

    Hồi đáp

    [-]

    crell (53)
      

    quan sát thú vị. Nếu bạn đang sắp xếp một mảng, vâng, điều đó sẽ tạo ra sự khác biệt lớn. Tuy nhiên, mục đích của

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    7 ở đây là cung cấp sự so sánh trực tiếp giữa các đối tượng và mảng, vì vậy chúng phải được sử dụng theo cùng một cách. Điều đó có nghĩa là
     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    7 để chúng tôi có thể so sánh quyền truy cập tài sản trong mỗi. Tôi không quan tâm nhiều đến bản thân việc sắp xếp vì việc sắp xếp là một cách dễ dàng để gọi
     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    $ser = serialize($list);
    unserialize($ser);
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\nSize: %s\n", $stop - $start, $memory, strlen($ser));
    
    9 và
    for ($i = 0; $i < TEST_SIZE; ++$i) {
      $o = new stdclass();
      $o->a = random_int(1, 500);
      $o->b = base64_encode(random_bytes(16));
      $list[$i] = $o;
    }
    
    ksort($list);
    
    usort($list, function($first, $second) {
      return [$first->a, $first->b] <=> [$second->a, $second->b];
    });
    
    
    0 hàng triệu lần. . -)

    $0. 00

    Hồi đáp

    [-]

    crell (53)
       (đã chỉnh sửa)

    Cái này cũ hơn, nhưng đây là bài đăng của Nikita Popov giải thích sự khác biệt về lưu trữ trong PHP 5. 4. https. //ý chính. github. com/nikic/5015323

    Các cấu trúc đã thay đổi đáng kể trong PHP 7, nhưng sự tối ưu hóa cơ bản mà anh ấy mô tả vẫn còn với chúng tôi và là lý do cho những kết quả này

    Một số bài viết gần đây về chủ đề này, quá

    https. //nikic. github. io/2011/12/12/Làm-lớn-là-PHP-mảng-thực-Hint-BIG. html
    https. //nikic. github. io/2014/12/22/PHPs-new-hashtable-implementation. html

    $0. 00

    Hồi đáp

    [-]

    jorgecastro (25)
       (đã chỉnh sửa)

    Chào bạn

    Tôi thực sự đã cố gắng sử dụng các lớp mô hình nhưng nó không thực tế

    Giả sử chúng ta muốn json_serialize. Ok, nó không phải là một vấn đề. Nhưng điều gì sẽ xảy ra nếu chúng ta có một trường được tạo bởi một mô hình khác

     random_int(1, 500),
        'b' => base64_encode(random_bytes(16)),
      ];
    }
    
    ksort($list);
    
    usort($list, function($first, $second) {
      return [$first['a'], $first['b']] <=> [$second['a'], $second['b']];
    });
    
    $stop = microtime(true);
    $memory = memory_get_peak_usage();
    printf("Runtime: %s\nMemory: %s\n", $stop - $start, $memory);
    
    5

    Nối tiếp nó không vui. Tuy nhiên, khử tuần tự hóa (json) là một thách thức lớn vì hệ thống không hiểu trường $typeCustomer nếu một đối tượng và nó khử tuần tự hóa thành stdClass, thì mọi phương thức được đính kèm với TypeCustomer đều thất bại

    https. // nhà phát triển. đến/jorgecc/php-là-xấu-cho-lập-trình-hướng-đối-tượng-oop-282a

    $0. 00

    Hồi đáp

    [-]

    a-0-1 (-4)(1)
      

    upvote cho tôi xin vui lòng? . //steemit. com/tin tức/@kinh thánh. com/6h36cq

    $0. 00

    • - crell

    Hồi đáp

    [-]

    waldi8 (35)
      

    bài viết rất hay. Tôi thường gặp những vấn đề này với mảng kết hợp khi viết mã cho các trang web như https. //www. nhận được. đồng

    Sự khác biệt giữa mảng kết hợp và đối tượng trong PHP là gì?

    Một đối tượng là một thể hiện của một lớp. Nó chỉ đơn giản là một mẫu vật của một lớp và được cấp phát bộ nhớ. Mảng là cấu trúc dữ liệu lưu trữ một hoặc nhiều loại giá trị tương tự trong một tên nhưng mảng kết hợp khác với một mảng PHP đơn giản . Một mảng chứa chỉ số chuỗi được gọi là mảng kết hợp.

    Sự khác biệt giữa mảng và đối tượng trong PHP là gì?

    Sự khác biệt cơ bản giữa mảng PHP và đối tượng là chúng ta không thể thay đổi quy tắc của mảng . PHP ngôn ngữ xác định những gì chúng ta có thể và không thể làm với một mảng và không có cách nào để chương trình PHP của bạn thay đổi điều đó. Mặt khác, các đối tượng có các quy tắc được xác định bởi chương trình PHP mà chúng đang chạy trong đó.

    Là một đối tượng một mảng kết hợp?

    Khi xử lý các đối tượng JavaScript dưới dạng mảng, Chuỗi được sử dụng làm chỉ mục để liên kết từng giá trị thuộc tính với tên đối tượng. Mảng loại này được gọi là "mảng kết hợp" .

    Mảng hoặc đối tượng nào nhanh hơn trong PHP?

    Sự khác biệt giữa mảng số và mảng kết hợp chỉ là 5%, vì vậy bạn có thể nói rằng chúng giống nhau. Việc sử dụng đối tượng chậm hơn +100% nhưng vẫn có thể chấp nhận được trong hầu hết các điều kiện (hay còn gọi là sử dụng gấp đôi thời gian). Việc gọi một phương thức hoặc việc sử dụng một hàm tạo sẽ làm tăng đáng kể giá trị.