Trong khoa học máy tính, **phí tổn** (tiếng Anh: *overhead*) là sự kết hợp bất kì của thời gian tính toán 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ần thiết để thực hiện một nhiệm vụ cụ thể. Đây là một trường hợp đặc biệt của phí tổn kỹ thuật. Phí tổn có thể là một yếu tố quyết định trong thiết kế phần mềm, liên quan đến cấu trúc, sửa lỗi và việc bổ sung các tính năng. Các ví dụ về phí tổn trong lĩnh vực máy tính có thể được tìm thấy trong lập trình hướng đối tượng (OOP), lập trình hàm, truyền dữ liệu và cấu trúc dữ liệu.

Thiết kế phần mềm
-----------------

### Lựa chọn cách triển khai

Một lập trình viên/kỹ sư phần mềm có thể phải lựa chọn giữa một số thuật toán, mã hóa, kiểu dữ liệu hoặc cấu trúc dữ liệu khác nhau, mỗi loại có các đặc điểm đã biết. Khi lựa chọn chúng, phí tổn tương ứng của chúng cũng nên được xem xét.

### Sự đánh đổi

Trong kỹ thuật phần mềm, phí tổn có thể ảnh hưởng đến quyết định về việc bổ sung các tính năng trong sản phẩm mới, hoặc thậm chí quyết định liệu có nên sửa lỗi hay không. Một tính năng có phí tổn cao có thể không được thêm vào - hoặc cần một động cơ về tài chính lớn để làm như vậy. Thông thường, ngay cả khi nhà cung cấp phần mềm biết rõ về các lỗi trong sản phẩm của họ, lợi ích từ việc sửa chúng không đáng để thực hiện, do phí tổn.

Ví dụ, một cấu trúc dữ liệu ngầm định hoặc cấu trúc dữ liệu gọn có thể có phí tổn không gian thấp, nhưng đánh đổi bằng hiệu suất chậm (sự đánh đổi không/thời gian).

### Độ phức tạp thời gian chạy của phần mềm

Độ phức tạp thuật toán thường được chỉ định bằng ký hiệu "Big O". Điều này không nói về việc một thuật toán chạy trong bao lâu hoặc sử dụng bao nhiêu bộ nhớ, mà nó chỉ thể hiện sự tăng của thuật toán phụ thuộc vào kích thước đầu vào. Phí tổn không được tính vào trong tính toán này một cách cố ý, vì nó thay đổi từ máy tính này sang máy tính khác, trong khi thời gian chạy cơ bản của một thuật toán thì không.

Điều này nên đối lập với hiệu quả thuật toán khi nó xem xét tất cả các loại tài nguyên - một sự kết hợp (mặc dù không phải là một sự kết hợp đơn giản) của độ phức tạp và phí tổn.

Ví dụ
-----

### Lập trình máy tính (thời gian chạy và phí tổn tính toán)

Việc một hàm tạo ra một phí tổn thời gian chạy nhỏ. Đôi khi, trình biên dịch có thể tối thiểu hóa phí tổn này bằng cách chèn nội dung của một số lời gọi hàm tại chỗ (hàm nội tuyến).

### Bộ nhớ đệm CPU

Trong bộ nhớ đệm CPU, "kích thước bộ nhớ đệm" (hoặc dung lượng) đề cập đến lượng dữ liệu mà bộ nhớ đệm lưu trữ. Ví dụ, một "bộ nhớ đệm 4 KB" là một bộ nhớ đệm chứa 4 KB dữ liệu. Số "4 KB" trong ví dụ này không bao gồm các bit phí tổn như thông tin về khung hình, địa chỉ và thẻ (tag).

### Giao tiếp (phí tổn truyền dữ liệu)

Việc gửi một gói dữ liệu một cách đáng tin cậy qua mạng truyền thông đòi hỏi việc gửi nhiều hơn là chỉ dữ liệu gốc. Nó còn liên quan đến việc gửi các dữ liệu điều khiển và tín hiệu khác nhau (TCP) cần thiết để đến đích. Điều này tạo ra một loại phí tổn giao thức (protocol overhead) vì các dữ liệu bổ sung này không đóng góp vào ý nghĩa cốt lõi của thông điệp.

Trong viễn thông, việc quay số và thời gian thiết lập cuộc gọi được xem là các phí tổn. Trong các hệ thống radio hai chiều (nhưng song công), việc dùng từ "kết thúc" và các tín hiệu khác cần thiết để tránh xung đột cũng là một loại phí tổn.

Phí tổn giao thức có thể được biểu thị dưới dạng phần trăm của các byte không phải dữ liệu ứng dụng (giao thức và đồng bộ khung) trong tổng số byte trong thông điệp.

### Mã hóa và cấu trúc dữ liệu (phí tổn kích thước)

Việc mã hóa thông tin và dữ liệu cũng tạo ra phí tổn. Ngày và giờ *"2011-07-12 07:18:47"* có thể được biểu diễn dưới dạng thời gian Unix với số nguyên 32-bit có dấu `1310447927`, chỉ tốn 4 byte. Biểu diễn dưới dạng chuỗi UTF-8 định dạng theo ISO 8601 `2011-07-12 07:18:47` sẽ tốn 19 byte, tạo ra một phí tổn về kích thước là 375% so với biểu diễn số nguyên nhị phân. Dưới dạng XML, ngày này có thể được viết như sau với phí tổn 218 ký tự, đồng thời thêm ngữ cảnh ngữ nghĩa rằng đó là một CHANGEDATE có chỉ số 1.

```
<?xml version="1.0" encoding="UTF-8"?>
<datetime qualifier="changedate" index="1">
 <year>2011</year>
 <month>07</month>
 <day>12</day>
 <hour>07</hour>
 <minute>18</minute>
 <second>47</second>
</datetime>

```
349 byte, phát sinh từ XML được mã hóa bằng UTF-8, tương ứng với một phí tổn kích thước là 8625% so với biểu diễn ban đầu dưới dạng số nguyên.

### Hệ thống tập tin

Ngoài bản thân tập, hệ thống tập tin máy tính còn sử dụng một phần không gian để lưu trữ tên thư mục và danh sách thư mục, tên tệp, vị trí các phân vùng tệp, các thuộc tính như thời gian sửa đổi và tạo, cách các tệp bị phân mảnh, được ghi và phần trống trong bộ nhớ, và nhật ký trên một số hệ thống tập tin.

Nhiều tập tin nhỏ tạo ra nhiều phí tổn hơn một ít tập tin lớn.

Xem thêm
--------

* Không gian chùng xuống
* Quy tắc quyền lực tối thiểu
* Máy Turing đa năng

Tham khảo
---------

1. ↑  Sorin, Daniel J. (2009). "Caches and Memory Hierarchies" (PDF). Truy cập ngày 13 tháng 3 năm 2019. Presentation for course in Computer Architecture.
2. ↑  Common Performance Issues in Network Applications Part 1: Interactive Applications, Windows XP Technical Articles, Microsoft
3. ↑  Protocol Overhead in IP/ATM Networks, Minnesota Supercomputer Center