Trên cao là gì?


149

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?


27
bạn cần phải làm thêm bao nhiêu "công cụ bổ sung" để có được thứ gì đó. ví dụ: Nếu tôi phải tải lên một dự án 37 lớp chỉ để in "Hello World", tôi sẽ xem xét rằng có rất nhiều chi phí.
scunliffe

1
@ doug65536 Thật ra nó là cách khác. =)
Yukio Fukuzawa

Câu trả lời:


177

Đó 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ộ".


84
Một sự tương tự tương tự sẽ được bay. Máy bay nhanh hơn nhiều so với ô tô, nhưng chi phí cho việc kiểm tra tại sân bay, an ninh, vv làm cho ô tô trở thành một lựa chọn tốt hơn cho khoảng cách ngắn hơn.
FogleBird

s / drive / go / (Nếu bạn cần lái xe ở đâu đó, bạn thường không quyết định đi bộ ...
RCIX

1
@ inf3rno Sự trớ trêu? Làm thế nào để chúng ta đến xe của chúng tôi? Chúng tôi đi bộ. Và chúng tôi hoàn toàn có thể đi bộ ... đến xe của chúng tôi. Chúng tôi không thể đi bộ đến đích, ngay cả khi nó gần hơn xe của chúng tôi.
corsiKa

Nếu tôi nói rằng tôi viết mã java trên đầu thấp, làm thế nào bạn diễn giải điều đó theo định nghĩa "tài nguyên cần thiết để thiết lập một hoạt động". Mã của tôi không yêu cầu thiết lập nhiều?
committedandroider

Chà, bạn phải bật máy tính hoặc máy chủ, bạn phải tải hệ điều hành và tất cả các trình điều khiển, bạn phải kích hoạt quy trình Java, bạn phải bật JVM, bạn phải tải tất cả các lớp của mình, bạn phải đồng bộ hóa bộ đệm IO với bàn điều khiển để bạn có thể thực hiện "thế giới xin chào" của mình. Nhưng xin vui lòng, cho tôi biết thêm về tiền mã hóa thấp.
corsiKa

40

Ý 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ụ:

  • Chi phí giao thức : Khung Ethernet, gói IP và phân đoạn TCP đều có tiêu đề, kết nối TCP yêu cầu gói bắt tay. Do đó, bạn không thể sử dụng toàn bộ băng thông mà phần cứng có khả năng cho dữ liệu thực tế của bạn. Bạn có thể giảm chi phí bằng cách sử dụng kích thước gói lớn hơn và UDP có tiêu đề nhỏ hơn và không bắt tay.
  • Chi phí bộ nhớ cấu trúc dữ liệu : Một danh sách được liên kết yêu cầu ít nhất một con trỏ cho mỗi phần tử mà nó chứa. Nếu các phần tử có cùng kích thước với một con trỏ, điều này có nghĩa là chi phí bộ nhớ 50%, trong khi đó một mảng có thể có 0% chi phí.
  • Chi phí cuộc gọi phương thức : Một chương trình được thiết kế tốt được chia thành nhiều phương thức ngắn. Nhưng mỗi cuộc gọi phương thức yêu cầu thiết lập một khung ngăn xếp, sao chép các tham số và địa chỉ trả về. Điều này thể hiện chi phí hoạt động của CPU so với một chương trình thực hiện mọi thứ trong một chức năng nguyên khối duy nhất. Tất nhiên, khả năng bảo trì được thêm vào làm cho nó rất đáng giá, nhưng trong một số trường hợp, các cuộc gọi phương thức quá mức có thể có tác động đáng kể về hiệu suất.

Âm thanh như từ này có cùng một nghĩa trong tất cả các ví dụ đó (cần thiết để thực hiện nhiệm vụ, nhưng không phải lúc nào cũng liên quan đến việc thực hiện trực tiếp)
RCIX

Chi phí bộ nhớ cấu trúc lại dữ liệu: Với hầu hết các cấp phát bộ nhớ, điều đó thậm chí còn tồi tệ hơn thế. Mỗi giá trị được trả về malloccó 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).
Donal Fellows

19

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í.


17

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.


4
Nhưng nếu không, bạn sẽ sửa WikiPedia, và sau đó thực hiện cùng một bài đăng ở đây.
Samoody

11

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).


5

Đố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ó.


3

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 .


2

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.


1

Bạn có thể kiểm tra Wikipedia . Nhưng chủ yếu là khi nhiều hành động hoặc tài nguyên được sử dụng. Giống như nếu bạn quen thuộc với .NET, bạn có thể có các loại giá trị và loại tham chiếu. Các loại tham chiếu có chi phí bộ nhớ vì chúng yêu cầu nhiều bộ nhớ hơn các loại giá trị.


1

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.


1

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ự.


-2

bất cứ thứ gì khác ngoài dữ liệu, ví dụ như cờ tcp, tiêu đề, crc, fcs, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.