Tôi là một sinh viên ngành Khoa học Máy tính và tôi đang nghe từ "trên cao" rất nhiều khi nói đến các chương trình và sắp xếp. Điều này có nghĩa là chính xác?
Tôi là một sinh viên ngành Khoa học Máy tính và tôi đang nghe từ "trên cao" rất nhiều khi nói đến các chương trình và sắp xếp. Điều này có nghĩa là chính xác?
Câu trả lời:
Đó là tài nguyên cần thiết để thiết lập một hoạt động. Nó có vẻ không liên quan, nhưng cần thiết.
Giống như khi bạn cần đi đâu đó, bạn có thể cần một chiếc xe hơi. Nhưng, sẽ có rất nhiều chi phí để có một chiếc xe để lái xuống đường, vì vậy bạn có thể muốn đi bộ. Tuy nhiên, chi phí sẽ rất đáng nếu bạn đi khắp đất nước.
Trong khoa học máy tính, đôi khi chúng ta sử dụng ô tô để đi xuống phố vì chúng ta không có cách nào tốt hơn hoặc không đáng để chúng ta "học cách đi bộ".
Ý nghĩa của từ này có thể khác nhau rất nhiều với bối cảnh. Nói chung, đó là tài nguyên (thường là bộ nhớ và thời gian CPU) được sử dụng, không đóng góp trực tiếp vào kết quả mong muốn, nhưng được yêu cầu bởi công nghệ hoặc phương pháp đang được sử dụng. Ví dụ:
malloc
có tổng phí 8 byte tích hợp do bộ cấp phát (giả sử máy 32 bit cổ điển) bao gồm kích thước của khối cộng với các giá trị bảo vệ. Và đó là trước khi bạn nghĩ về độ chi tiết phân bổ. Do đó, một danh sách liên kết đơn gồm các số nguyên 4 byte đơn giản sẽ có tổng phí là 75%; mảng tốt hơn nhiều (trừ khi bạn cần chèn nhanh ở giữa) vì chúng có thể có chi phí một lần (hoặc ít hơn, nếu mảng không được phân bổ động).
Bạn mệt mỏi và không thể làm bất kỳ công việc nữa. Bạn ăn thức ăn. Năng lượng dành cho việc tìm kiếm thức ăn, lấy nó và thực sự ăn nó tiêu thụ năng lượng và là chi phí!
Trên cao là một cái gì đó lãng phí để hoàn thành một nhiệm vụ. Mục tiêu là làm cho chi phí rất nhỏ.
Trong khoa học máy tính cho phép bạn muốn in một số, đó là nhiệm vụ của bạn. Nhưng lưu trữ số, thiết lập màn hình để in nó và gọi các thói quen để in nó, sau đó truy cập số từ biến là tất cả chi phí.
Wikipedia đã bảo vệ chúng tôi :
Trong khoa học máy tính, chi phí chung được coi là bất kỳ sự kết hợp nào của thời gian tính toán dư thừa hoặc gián tiếp, bộ nhớ, băng thông hoặc các tài nguyên khác được yêu cầu để đạt được một mục tiêu cụ thể. Đây là một trường hợp đặc biệt của kỹ thuật trên không.
Chi phí thường đề cập đến lượng tài nguyên bổ sung (bộ nhớ, bộ xử lý, thời gian, v.v.) mà các thuật toán lập trình khác nhau sử dụng.
Ví dụ, tổng chi phí chèn vào Cây nhị phân cân bằng có thể lớn hơn nhiều so với chèn vào Danh sách liên kết đơn giản (quá trình chèn sẽ mất nhiều thời gian hơn, sử dụng nhiều sức mạnh xử lý hơn để cân bằng Cây, khiến thời gian hoạt động được kéo dài hơn người dùng).
Đối với chi phí lập trình viên đề cập đến các tài nguyên hệ thống được sử dụng bởi mã của bạn khi nó chạy trên nền tảng cung cấp trên một tập hợp dữ liệu đầu vào nhất định. Thông thường thuật ngữ này được sử dụng trong bối cảnh so sánh các triển khai khác nhau hoặc các triển khai có thể.
Ví dụ, chúng tôi có thể nói rằng một cách tiếp cận cụ thể có thể phải chịu chi phí CPU đáng kể trong khi một phương pháp khác có thể phải chịu thêm chi phí bộ nhớ và một phương pháp khác có thể có trọng số đối với chi phí mạng (ví dụ, đòi hỏi phải phụ thuộc bên ngoài).
Hãy cho một ví dụ cụ thể: Tính trung bình (trung bình số học) của một tập hợp số.
Cách tiếp cận rõ ràng là lặp qua các đầu vào, giữ cho tổng số hoạt động và số đếm. Khi gặp số cuối cùng (được báo hiệu bằng "cuối tệp" EOF hoặc một số giá trị sentinel hoặc một số giao diện GUI, bất cứ điều gì), chúng ta chỉ cần chia tổng số cho số lượng đầu vào và chúng ta đã hoàn thành.
Cách tiếp cận này hầu như không phát sinh chi phí nào về CPU, bộ nhớ hoặc các tài nguyên khác. (Đó là một nhiệm vụ tầm thường).
Một cách tiếp cận khả thi khác là "nhét" đầu vào vào danh sách. Lặp lại danh sách để tính tổng, sau đó chia số đó cho số mục hợp lệ từ danh sách.
Bằng cách so sánh, phương pháp này có thể phát sinh số lượng bộ nhớ tùy ý.
Trong một triển khai xấu cụ thể, chúng tôi có thể thực hiện thao tác tổng bằng cách sử dụng đệ quy nhưng không loại bỏ đuôi. Bây giờ, ngoài chi phí bộ nhớ cho danh sách của chúng tôi, chúng tôi cũng giới thiệu chi phí ngăn xếp (là một loại bộ nhớ khác và thường là tài nguyên hạn chế hơn các dạng bộ nhớ khác).
Tuy nhiên, một cách tiếp cận khác (có thể ngớ ngẩn hơn) sẽ là đăng tất cả các đầu vào lên một số bảng SQL trong RDBMS. Sau đó, chỉ cần gọi hàm SQL SUM trên cột đó của bảng đó. Điều này chuyển chi phí bộ nhớ cục bộ của chúng tôi sang một số máy chủ khác và phát sinh chi phí mạng và phụ thuộc bên ngoài vào quá trình thực thi của chúng tôi. (Lưu ý rằng máy chủ từ xa có thể có hoặc không có bất kỳ chi phí bộ nhớ cụ thể nào được liên kết với tác vụ này --- chẳng hạn, nó có thể chuyển tất cả các giá trị ra ngoài để lưu trữ).
Về mặt giả thuyết có thể xem xét việc triển khai trên một số loại cụm (có thể để làm cho việc tính trung bình hàng nghìn tỷ giá trị khả thi). Trong trường hợp này, bất kỳ mã hóa và phân phối cần thiết nào của các giá trị (ánh xạ chúng ra các nút) và việc thu thập / đối chiếu kết quả (giảm) sẽ được tính là chi phí chung.
Chúng ta cũng có thể nói về chi phí phát sinh bởi các yếu tố ngoài mã riêng của lập trình viên. Ví dụ, việc biên dịch một số mã cho bộ xử lý 32 hoặc 64 bit có thể đòi hỏi chi phí hoạt động cao hơn so với kiến trúc 8 bit hoặc 16 bit cũ. Điều này có thể liên quan đến chi phí bộ nhớ lớn hơn (vấn đề căn chỉnh) hoặc chi phí CPU (trong đó CPU buộc phải điều chỉnh thứ tự bit hoặc sử dụng các hướng dẫn không liên kết, v.v.) hoặc cả hai.
Lưu ý rằng không gian đĩa được chiếm bởi mã của bạn và các thư viện của nó, v.v. thường không được gọi là "phí", mà được gọi là "dấu chân". Ngoài ra, bộ nhớ cơ sở mà chương trình của bạn tiêu thụ (không liên quan đến bất kỳ tập dữ liệu nào mà nó đang xử lý) cũng được gọi là "dấu chân" của nó.
Chi phí đơn giản là tiêu thụ nhiều thời gian hơn trong việc thực hiện chương trình. Thí dụ ; Khi chúng ta gọi một hàm và điều khiển của nó được chuyển đến nơi nó được xác định và sau đó phần thân của nó được thực thi, điều này có nghĩa là chúng ta làm cho CPU của chúng ta chạy qua một quá trình dài (đầu tiên chuyển điều khiển đến nơi khác trong bộ nhớ và sau đó thực thi ở đó và sau đó thực thi vượt qua sự kiểm soát trở lại vị trí cũ), do đó phải mất rất nhiều thời gian thực hiện, do đó, Overhead. Mục tiêu của chúng tôi là giảm chi phí này bằng cách sử dụng nội tuyến trong định nghĩa hàm và thời gian gọi, sao chép nội dung của hàm tại lệnh gọi do đó chúng tôi không chuyển điều khiển sang một vị trí khác, nhưng tiếp tục chương trình của chúng tôi theo dòng, do đó nội tuyến .
Bạn có thể sử dụng một từ điển. Định nghĩa là như nhau. Nhưng để tiết kiệm thời gian của bạn, Overhead là công việc cần thiết để thực hiện công việc hiệu quả. Chẳng hạn, một thuật toán chạy và thực hiện công việc hữu ích, nhưng đòi hỏi bộ nhớ để thực hiện công việc của nó. Việc phân bổ bộ nhớ này mất thời gian và không liên quan trực tiếp đến công việc đang thực hiện, do đó là chi phí chung.
Một ví dụ cụ thể về chi phí chung là sự khác biệt giữa cuộc gọi thủ tục "cục bộ" và cuộc gọi thủ tục "từ xa".
Ví dụ, với RPC cổ điển (và nhiều khung từ xa khác, như EJB), một cuộc gọi hàm hoặc phương thức trông giống như một bộ mã hóa cho dù đó là cuộc gọi cục bộ, trong cuộc gọi bộ nhớ hoặc cuộc gọi mạng phân tán.
Ví dụ:
service.function(param1, param2);
Đó là một phương pháp bình thường, hay một phương pháp từ xa? Từ những gì bạn thấy ở đây bạn không thể nói.
Nhưng bạn có thể tưởng tượng rằng sự khác biệt về thời gian thực hiện giữa hai cuộc gọi là rất lớn.
Vì vậy, trong khi việc thực hiện cốt lõi sẽ "chi phí như nhau", thì "chi phí" liên quan lại hoàn toàn khác.
Hãy suy nghĩ về chi phí là thời gian cần thiết để quản lý các luồng và phối hợp giữa chúng. Đó là một gánh nặng nếu luồng không có đủ nhiệm vụ để làm. Trong trường hợp như vậy, chi phí vượt quá thời gian tiết kiệm thông qua việc sử dụng luồng và mã mất nhiều thời gian hơn so với tuần tự.
bất cứ thứ gì khác ngoài dữ liệu, ví dụ như cờ tcp, tiêu đề, crc, fcs, v.v.