Tối ưu hóa JavaScript cho các vòng lặp lồng nhau

Kỹ thuật tối ưu hóa vòng lặp. bộ 2

Cải thiện bài viết

Lưu bài viết

Thích bài viết

  • Độ khó. Trung bình
  • Cập nhật lần cuối. 02/06/2020

  • Đọc
  • Bàn luận
  • khóa học
  • Luyện tập
  • Băng hình
  • Cải thiện bài viết

    Lưu bài viết

    Điều kiện tiên quyết - Tối ưu hóa vòng lặp. Hiệp 1

    1. vòng phân hạch. cải thiện vị trí của tham chiếu –
    Trong trường hợp này, một vòng lặp được chia thành nhiều vòng lặp trên cùng một phạm vi chỉ mục, nhưng mỗi vòng lặp mới chỉ chứa một phần cụ thể của nội dung vòng lặp ban đầu. Điều này có thể cải thiện vị trí tham chiếu.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)                          
    {a[i]=…
    b[i]=…
    }

    Sau khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…

    2. Trao đổi vòng lặp. cải thiện vị trí tham chiếu –
    Trong các tối ưu hóa này, trao đổi các vòng lặp bên trong với các vòng lặp bên ngoài. Khi các biến vòng lặp lập chỉ mục thành một mảng, một phép biến đổi như vậy có thể cải thiện vị trí của tham chiếu, tùy thuộc vào bố cục của mảng.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    for(j=0;j<100;j++)
    a[j][i]=…

    Sau khi tối ưu hóa

    for(j=0;j<100;j++)
    for(i=0;i<100;i++)
    a[j][i]=…

    3. Đảo ngược vòng lặp –
    Đảo ngược thứ tự gán giá trị cho biến chỉ mục. Điều này có thể giúp loại bỏ các phụ thuộc và do đó cho phép các tối ưu hóa khác.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    a[99-i]=…  

    Sau khi tối ưu hóa

    for(i=99;i>=0;i--)
    a[i]=…

    4. Bỏ kiểm soát vòng lặp. giảm thiểu kiểm tra và nhảy nhưng tăng kích thước mã –
    Mục tiêu của bỏ kiểm soát vòng lặp là tăng tốc độ của chương trình bằng cách giảm các lệnh điều khiển vòng lặp, chẳng hạn như số học con trỏ và điều kiện kiểm tra “kết thúc vòng lặp” trên . Để loại bỏ hoặc giảm chi phí tính toán này, các vòng lặp có thể được viết lại thành một chuỗi lặp lại các câu lệnh độc lập tương tự.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…  

    Sau khi tối ưu hóa

    for(i=0;i<100;i+=2)
    {a[i]=…
    a[i+1]=…
    }

    5. Tách vòng lặp –
    Điều này cố gắng đơn giản hóa một vòng lặp hoặc loại bỏ các yếu tố phụ thuộc bằng cách chia vòng lặp đó thành nhiều vòng lặp có cùng nội dung nhưng lặp lại trên các phần khác nhau của phạm vi chỉ mục.

    Trước khi tối ưu hóa

    ________số 8

    Sau khi tối ưu hóa

    for(i=0;i<50;i++)
    a[i]=…
    for(;i<100;i++)
    b[i]=…

    6. lột vòng lặp. trường hợp đặc biệt của tách vòng lặp –
    Trường hợp đặc biệt của tách vòng lặp là tách vòng lặp, có thể đơn giản hóa một vòng lặp với lần lặp đầu tiên có vấn đề bằng cách thực hiện riêng rẽ bước lặp đó trước khi vào vòng lặp.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    0

    Sau khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    1

    7. Hủy chuyển đổi –
    Di chuyển một điều kiện từ bên trong một vòng lặp ra bên ngoài vòng lặp đó bằng cách sao chép phần thân của vòng lặp và đặt   một phiên bản của nó bên trong mỗi mệnh đề if và other của điều kiện.

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    2

    Sau khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    3

    8. Thay thế kiểm tra vòng lặp. tăng khả năng loại bỏ mã chết –

    Trước khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    4

    Sau khi tối ưu hóa

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    5

    Ghi chú cá nhân của tôi arrow_drop_up

    Tiết kiệm

    Vui lòng Đăng nhập để nhận xét.

    Vòng lặp đóng một vai trò quan trọng trong hiệu suất ứng dụng. Các vòng lặp được sử dụng phổ biến nhất, tác động thực thi được đo bằng mẫu dữ liệu khổng lồ

    Vài ngày trước, một cuộc thảo luận đã diễn ra trong nhóm phụ trợ nút liên quan đến hiệu suất của các ứng dụng có thể mở rộng trong Node. js. Không ai nghi ngờ về tốc độ nút nhưng kiến ​​trúc ứng dụng và thực thi mã cũng quan trọng không kém. Một hệ thống được thiết kế tốt và mã sạch đóng vai trò quan trọng trong việc thực thi ứng dụng. Vì vậy, tôi đã chọn viết một cái gì đó từ vùng mã để giúp cải thiện thời gian thực thi mã

    Vòng lặp là một yếu tố thiết yếu của mã được các nhà phát triển yêu cầu trong nhiều tình huống. Tôi đã chọn thảo luận chi tiết về hiệu suất thực thi của vòng lặp với số liệu thống kê để xác định hiệu quả của vòng lặp trong các điều kiện và môi trường khác nhau

    Hiệu quả không chỉ cần thiết cho giá nhiên liệu tăng vọt

    Lặp lại các bộ sưu tập là một thành phần cấu thành trong mã hóa, cộng với nếu dữ liệu liên quan đến các cấu trúc phức tạp thì các vòng lặp lồng nhau là không thể tránh khỏi. Do đó, chúng tôi sẽ kiểm tra hiệu suất của các vòng lặp khác nhau dựa trên thời gian thực hiện của mỗi vòng lặp trên mẫu dữ liệu cụ thể

    Chúng tôi sẽ kiểm tra hiệu suất của các vòng lặp trên mảng một chiều và mảng lởm chởm (mảng của mảng), mỗi vòng lặp sẽ chạy nhiều lần để quan sát thời gian trung bình được thực hiện trong các môi trường, máy móc và hệ điều hành khác nhau. Hãy trao cơ hội công bằng cho tất cả mọi người

    Mảng một chiều (10 triệu lần lặp)

    Một mảng chứa 10 triệu số theo thứ tự, cấu trúc này sẽ được duyệt qua nhiều lần bởi các vòng lặp khác nhau, giá trị trung bình sẽ được tính dựa trên thời gian thực hiện của một vòng lặp. Mã mẫu cho cấu trúc điền và cú pháp vòng lặp khác nhau được sử dụng trong thử nghiệm như sau. Vui lòng lưu ý, mỗi vòng lặp thực hiện cùng một hướng dẫn bên trong phần thân không được đề cập ở đây để giữ cho mẫu sạch sẽ để dễ hiểu

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    6

    Các số sau được tạo bằng mili giây trong các môi trường khác nhau

    Số liệu thống kê khá thú vị trên một nền tảng khác nhưng các vòng lặp cổ điển cho thấy hiệu suất dữ liệu tốt hơn so với Foreach và ES6. Một bức tranh đáng giá cả ngàn lời nói nên tốt hơn là đánh giá các con số trong biểu đồ

    Reverse-while đang dẫn đầu một sprint nhưng chắc chắn, reverse-while không thể được sử dụng trong nhiều trường hợp. Đối với vòng lặp, hiệu suất rất ấn tượng với sự khác biệt nhỏ nhưng trước khi đi đến kết luận, hãy thử các vòng lặp tương tự trên các mảng lởm chởm

    Mảng hai chiều (100 triệu lần lặp)

    Thiết lập bộ sưu tập với 10.000 mục và mỗi mục có thêm 10.000 mục con nên để truy cập từng mục trong vòng lặp, cần 10.000 * 10.000 = 100.000.000 (100 triệu lần lặp). Mã mẫu cho cấu trúc điền và cú pháp vòng lặp khác nhau được sử dụng trong thử nghiệm như sau

    for(i=0;i<100;i++)
    a[i]=…
    for(i=0;i<100;i++)
    b[i]=…
    7

    Các số sau được tạo trong mili giây

    Một so sánh cho thấy rằng một lần nữa, vòng vani cổ điển hoạt động tốt hơn. Các kết quả trên khá bất ngờ đối với một mảng răng cưa ngược lại trong khi hoạt động chậm hơn một chút với cấu trúc lồng nhau so với mảng một chiều, do đó nên đánh giá cấu trúc theo tình huống. Hãy so sánh các vòng lặp trong biểu đồ thanh

    Người ta có thể dễ dàng đưa ra quyết định rằng các vòng lặp cổ điển có hiệu quả tốt hơn nhiều nhưng nếu cấu trúc không chứa dữ liệu lớn thì ES6 hoặc forEach có thể chọn bản chất cú pháp thân thiện và mã dễ bảo trì hơn về mặt chủ quan nhưng nếu tốc độ là mục tiêu thì các vòng lặp cổ điển không đáng kể

    Một lý do hợp lý cho việc chậm

    Trong trường hợp các vòng lặp cổ điển, động cơ chủ yếu cần lo lắng về độ dài, gia số và kết thúc nhưng mặt khác, thiết lập chức năng và dọn dẹp nội dung sau khi hoàn thành công việc là một chi phí lớn

    Các công cụ ngôn ngữ cấp cao được triển khai với các sự đánh đổi khác nhau phụ thuộc vào nhiều yếu tố như hiệu suất, tốc độ, tính dễ dàng, bảo trì, v.v. đóng vai trò quan trọng trong việc thực thi mã. Stack Overflow có một bài đăng rất hay dành riêng cho chủ đề này, điều này sẽ chứng minh thêm lý do chậm hơn

    Kết quả cuối cùng (cũng từ nhiều bài báo)

    1. Các vòng lặp cổ điển có hiệu suất tốt hơn nhiều nhưng nếu một mảng có dữ liệu hạn chế và cần có các thao tác đơn giản thì thay thế không có vẻ tệ cho mục đích bảo trì mã
    2. Các vòng lặp có thể hoạt động khác nhau trong các trường hợp, do đó hãy quan sát hiệu suất một cách khôn ngoan theo yêu cầu
    3. Chỉ định độ dài mảng trong một biến khác trong câu lệnh mảng mang lại sự khác biệt không đáng kể trong Node. js
    4. Các vòng lặp cổ điển không chỉ tốt hơn về hiệu suất mà còn tránh được các lỗi có thể xảy ra do tính linh hoạt của javascript. Stack Overflow có một câu trả lời rất hay về thời điểm nên tránh và khi nào nên sử dụng for … in loop
    5. Luôn quan sát hiệu suất mã trong các môi trường khác nhau. Không có gì là hoàn hảo ngoài Tạo hóa, luôn có chỗ cho sự ngẫu hứng

    Hãy đánh tôi nếu có bất kỳ phát hiện nào để chia sẻ với các chuyên viên máy tính. Các lĩnh vực mã và cấu trúc khác sẽ được khám phá trong các bài đăng sắp tới, hãy theo dõi chúng tôi

    Làm cách nào để tối ưu hóa cho vòng lặp trong JavaScript?

    Vòng lặp for bao gồm bốn phần. khởi tạo, điều kiện kiểm tra trước, thân vòng lặp và sau khi thực hiện. Cách nó hoạt động như sau. đầu tiên, mã khởi tạo được thực thi (var i = 0;). Vậy điều kiện thử trước (i < 10;). Nếu điều kiện kiểm tra trước đánh giá là t rue, thì phần thân của vòng lặp được thực thi .

    Làm cách nào chúng ta có thể giảm độ phức tạp về thời gian của vòng lặp for lồng nhau?

    Hầu hết thời gian, thay vì cố gắng tìm đến các giải pháp phức tạp khác như lưu vào bộ nhớ đệm và thậm chí là các giải pháp phức tạp hơn, hiểu phân tích thuật toán có thể hữu ích . Hơn nữa, trong trường hợp các vòng lặp thực hiện các truy vấn cơ sở dữ liệu bằng ORM, nhiều vòng lặp lồng nhau có thể được cải thiện chỉ bằng cách sử dụng SQL THAM GIA.

    Vòng lặp for nào nhanh hơn trong JavaScript?

    Vòng lặp nhanh nhất là vòng lặp for, cả khi có và không có độ dài bộ nhớ đệm đều mang lại hiệu suất thực sự giống nhau. .
    Vòng lặp while với số lần giảm khoảng 1. Chậm hơn 5 lần so với vòng lặp for
    Một vòng lặp sử dụng chức năng gọi lại (như forEach tiêu chuẩn), chậm hơn khoảng 10 lần so với vòng lặp for

    Cái nào nhanh hơn forEach hay for loop JavaScript?

    forEach Loop . Nó chậm hơn so với vòng lặp truyền thống về hiệu suất.