Function trong javascript có cache không?

Hi there, em có một ví dụ như này

const heavyFunc = (a,b) => {
       // pure function
      // hàm đồng bộ này chạy lâu, mà lại tốn CPU, ngốn RAM
      return a+b;
}

console.log(heavyFunc(123,345)) // gọi lần thứ 1
console log(heavyFunc(123,345)) // truyền đối số như bên trên

Cho em hỏi có cách nào heavyFunc với đối số 123, 345 chạy một lần mà kể từ lần 2 trở đi nó không tính lại nữa mà lấy kết quả lần 1 luôn. Em cảm ơn nhiều

nếu muốn vậy thì mình nghĩ bạn cần tự implement cơ chế cache thôi, lưu lại kết quả tính được vào client storage với uniq key sinh ra dựa tham số truyền vào, trước khi thực hiện xử lý tác vụ nặng kia thì check xem có kết quả đã tính chưa, nếu có thì trả về luôn, còn chưa thì thực hiện tính toán và lưu cache sau đó mới trả về kết quả.
trường hợp không cần giữ cache khi load lại trang thì bạn có thể lưu cache vào 1 biến thôi, như này

6 Likes

Đàng nào nó cũng nằm ở trình duyệt rồi, và đa số bài toán không phải là những phép tính tốn hàng giờ để tính, nên cách làm đơn giản là gán vào một biến thay vì write ra ngay rồi sau đó cần xuất ra thì chỉ cần write biến đó ra.

7 Likes

Nhỡ trường hợp hàm javascript đó chạy trên nodejs thì sao anh, VD: mã hóa, xử lý ảnh, trainning AI, …

Thì cũng có khác gì, NodeJS là môi trường để JavaScript chạy thì không lẽ phép tính toán đó nằm bên ngoài môi trường?

Cần phân biệt được kết quả tính toán phức tạp nhưng đáp án ngắn gọn với hàng tá dữ liệu được trả về như hàng triệu biểu ghi. Nếu dữ liệu lớn thì ta dùng những kỹ thuật cache chuyên dụng như Redis hoặc các kỹ thuật cache khác đang thông dụng, dễ cài đật.

8 Likes
//Dùng kỹ thuật Memoization để lưu những params đã từng được sử dụng và cache => tối ưu hóa những lần run sau
        const expensiveFunction = (number) => {
            // Init cache
            if (!expensiveFunction.cache) {
                expensiveFunction.cache = {};
            }
            // Return cache if found
            const key = `${number}`;
            if (expensiveFunction.cache[key]) return expensiveFunction.cache[key];
 
            // Calculate
            const start = new Date();
            console.log("Start expensiveFunction", start.getTime());
            while (new Date() - start < 2000);
            console.log("End expensiveFunction", new Date().getTime());
            const square = number * number;
 
            // Save to cache
            expensiveFunction.cache[key] = square;
            return square;
        }
 
        console.log(expensiveFunction(2)); // Tính toán và lưu cache, trả về 4
        console.log(expensiveFunction(3)); // Tính toán và lưu cache, trả về 9
        console.log(expensiveFunction(2)); // Lần sau trả về 4 mà không cần tính toán nữa
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?