Hỏi cách tìm manh mối để giải quyết vấn đề fetch request bị chậm

Hi cả nhà,
Mình đang thực hiện bảo trì một dự án trên front-end sử dụng ReactJS. Cụ thể công việc là tối ưu hoá thời gian load trang. Sau khi chỉnh sửa một chút logic và cải thiện việc render, trang đã giảm thời gian tải từ 35s xuống 10s.
Vấn đề phát sinh ở đây, khi mình sử dụng performance.now() và tab netwrok của chrome để kiểm tra thời gian mà FE gửi, nhận và xử lý HTTP request (sử dụng fetch) thì thấy rằng nó cực kỳ khác nhau.
Trên tab network của Chrome, nó chỉ mất vài trăm milisecond, nhưng trên FE, nó mất tới 2-3s để hoàn thành gửi, nhận và xử lý request đó.
Cùng trang đó, mình test trên các browser khác nhau thì nhận được kết quả khác nhau, nổi bật nhất là Firefox, tốn ~1s. Chậm nhất là Chrome: 2-3s.
Mình tiếp tục copy code đó dán vô console của chrome thì chỉ mất có vài trăm milisecond.

Hàm fetch thì vô cùng đơn giản, chỉ xử lý vài việc đơn giản như này:

import React from 'react';
import './App.scss';

class MyClass {
  // Other code....
  fetchRequest(){
    let requestOptions = {
      method: 'GET', redirect: 'follow'
    };

    let t1 = performance.now();
    fetch("http://127.0.0.1:5000/", requestOptions)
      .then(response => {
        const t2 = performance.now();
        console.log("Time to response: ", (t2 - t1) / 1000);
        response.text();
      })
      .then(result => {
        const t2 = performance.now();
        console.log("Time to parse text: ", (t2 - t1) / 1000);
        console.log(result);
      })
      .catch(error => {
        const t2 = performance.now();
        console.log("Time to parse text: ", (t2 - t1) / 1000);
        console.log('error', error);
      });
  }
}

function App() {

  const handleClick = () => {
    new MyClass().fetchRequest();
  };
  return (<div className="App">
    <h1 onClick={()=>handleClick()}>Hello HTML Table with Custom Virtualization</h1>
  </div>);
}

Kết quả trên các trình duyệt:

// Chrome
Time to request:  3.0208000000007451
App.js:86 Time to parse text:  3.0209000000003725

// Firefox:
Time to request:  1.1452343456456
App.js:86 Time to parse text:  1.1598659345

// Sử dụng Chrome console hoặc Posman: < 1 second

Mình thực sự chưa hiểu nguyên nhân ở đâu và khắc phục như thế nào. Nhờ mọi người chỉ giúp. Mình muốn hiểu tường tận hơn là áp code vô chạy nên nếu được mọi người cho mình xin thêm các tài liệu liên quan để hiểu hơn nhé.

Cảm ơn cả nhà.

client không đáng tin cậy, tại sao bạn không check log phía server

3 Likes

Vấn đề có thể là do bạn có 1 cái tính toán nào lâu (sync chứ k phải async) nó block cái event loop (xin lỗi mình ko biết cái này tiếng việt), nên cho dù backend bạn chỉ mất 1ms để trả kết quả, thì frontend lại mất 1s mới nhận đc

2 Likes

Thực sự thì mình đã check rồi và thấy không có gì bất thường cả. BE response rất nhanh, mình nghĩ là do vấn đề gì đó từ FE

Chà cái này hay. Mình có cách nào để truy vết xem thằng nào đang block không ạ? Do dự án cũ, luồng nhiều, flow cũng khá phức tạp nên truy vết cũng hơi vất ạ.

Nhờ gợi ý của bác em có tìm hiểu thì thấy và hiểu vấn đề ùi. Giờ em đang kiếm xem thằng nào block và kiếm hướng giải quyết. Cảm ơn bác rất nhiều

trên tab network, chỉ có log phần gửi nhân thôi
làm code của bạn có cả “xử lý request đó” thì làm sao mà nhanh hơn được

còn code của bạn “Time to response:” nhưng sao log của bạn lại là “Time to request”
mình thấy khá mơ hồ

làm code của bạn có cả “xử lý request đó” thì làm sao mà nhanh hơn được

Mình đâu có muốn nó nhanh hơn? Chỉ là sự khác nhau quá lớn nên mình mới thắc mắc.

còn code của bạn “Time to response:” nhưng sao log của bạn lại là “Time to request”
mình thấy khá mơ hồ

Cái này lỗi mình, copy code ra xoá bớt chỉnh sửa lại đăng lên diễn đàn mà quên sửa lại cái text

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?