2010-04-09 52 views
12

Tôi đã đọc với sự quan tâm của bài đăng C difference between malloc and calloc. Tôi đang sử dụng malloc trong mã của tôi và muốn biết những gì khác biệt tôi sẽ có bằng cách sử dụng calloc thay thế.calloc v/s malloc và hiệu quả thời gian

hiện (giả) Mã của tôi với malloc:

Kịch bản 1

int main() 
{ 
    allocate large arrays with malloc 

    INITIALIZE ALL ARRAY ELEMENTS TO ZERO 

    for loop //say 1000 times 
    do something and write results to arrays 
    end for loop 

    FREE ARRAYS with free command 

} //end main 

Nếu tôi sử dụng calloc thay vì malloc, sau đó tôi sẽ có:

Scenario2

int main() 
{ 

    for loop //say 1000 times 
    ALLOCATION OF ARRAYS WITH CALLOC 

    do something and write results to arrays 

    FREE ARRAYS with free command 

    end for loop 


} //end main 

Tôi có ba câu hỏi:

  1. Kịch bản nào hiệu quả hơn nếu mảng rất lớn?

  2. Kịch bản nào sẽ hiệu quả hơn nếu các mảng rất lớn?

  3. Trong cả hai trường hợp, tôi chỉ ghi vào mảng theo nghĩa cho bất kỳ lần lặp nào đã cho trong vòng lặp for, tôi viết từng mảng tuần tự từ phần tử đầu tiên đến phần tử cuối cùng. Câu hỏi quan trọng: Nếu tôi đang sử dụng malloc như trong kịch bản 1, thì tôi có cần khởi tạo các phần tử bằng không? Nói với malloc tôi có mảng z = [garbage1, garbage2, garbage 3]. Đối với mỗi lần lặp, tôi đang viết các phần tử tuần tự, tức là trong lần lặp đầu tiên tôi nhận được z = [some_result, garbage2, garbage3], trong lần lặp thứ hai tôi nhận được trong lần lặp đầu tiên, tôi nhận z = [some_result, another_result, garbage3] và trên, sau đó tôi cần đặc biệt để khởi tạo mảng của tôi sau khi malloc?

+0

trùng lặp có thể xảy ra http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc –

+0

Vâng, đây là lý do tại sao tôi đã đề cập rằng tôi đọc bài đăng khác. Tôi muốn cụ thể hơn một chút ở đây. – yCalleecharan

+0

Bạn đã tự đo nó chưa? Kết quả trên máy của bạn là gì? – Secure

Trả lời

9

Giả sử tổng dung lượng bộ nhớ đang được khởi tạo trong hai ví dụ của bạn là như nhau, phân bổ bộ nhớ với calloc() có thể là nhanh hơn so với phân bổ bộ nhớ với malloc() và sau đó zeroing chúng ra trong một bước riêng biệt, đặc biệt là nếu trong trường hợp malloc() bạn không phải là các phần tử riêng lẻ bằng cách lặp qua chúng trong một vòng lặp. A malloc() theo sau là memset() có thể sẽ nhanh tới mức calloc().

Nếu bạn không quan tâm rằng các phần tử mảng là rác trước khi bạn lưu trữ các kết quả tính toán vào chúng, không cần phải khởi tạo các mảng của bạn sau malloc().

+0

Tuyệt vời. Một câu hỏi: Là memset() gây ra khởi tạo bằng không hoặc NULL? – yCalleecharan

+0

Tôi đang sử dụng C. Tôi nghĩ memset() là dành cho C++ và không có sẵn trong C. – yCalleecharan

+15

Bạn nghĩ sai. memset() có sẵn trong C. – Secure

1

Đối với 1 và 2, cả hai đều làm tương tự: phân bổ và không, sau đó sử dụng mảng.

Đối với 3, nếu bạn không cần không phải là mảng đầu tiên, sau đó zeroing là không cần thiết và không làm nó nhanh hơn.

Có khả năng zeroing của calloc hiệu quả hơn mã bạn viết, nhưng sự khác biệt này sẽ nhỏ so với phần còn lại của công việc mà chương trình làm. Tiền tiết kiệm thực sự của calloc không phải tự viết mã đó.

+0

Cảm ơn những nhận xét thú vị của bạn. – yCalleecharan

0

Các phương pháp callocmemset sẽ giống nhau, và có thể nhanh hơn một chút so với việc tự đánh số nó.

Bất kể, tất cả đều liên quan đến những gì bạn làm trong vòng lặp chính của bạn, có thể là đơn đặt hàng lớn hơn.

+0

Cảm ơn. Những gì đang xảy ra bên trong vòng lặp có thể mất nhiều thời gian hơn. – yCalleecharan

0

Điểm của bạn được nêu trong 3. dường như chỉ ra trường hợp hoặc khởi tạo không cần thiết. Đó là tốc độ khá tồi tệ, không chỉ thời gian dành cho nó là lãng phí nhưng toàn bộ rất nhiều việc xóa bỏ bộ nhớ cache đã xảy ra vì nó.

Thực hiện memset() hoặc bzero() (được gọi là calloc() anyway) là cách hay để làm mất hiệu lực phần lớn bộ nhớ cache của bạn. Đừng làm điều đó trừ khi bạn chắc chắn rằng bạn sẽ không ghi đè tất cả mọi thứ nhưng có thể đọc các phần của bộ đệm sẽ không được viết (như thể 0 là một giá trị mặc định có thể chấp nhận được). Nếu bạn viết trên tất cả mọi thứ bằng mọi cách có nghĩa là không khởi tạo bộ nhớ của bạn không cần thiết.

Viết bộ nhớ không cần thiết sẽ không chỉ làm hỏng hiệu suất ứng dụng của bạn mà còn hiệu suất của tất cả các ứng dụng chia sẻ cùng một CPU với nó.

+0

Cảm ơn bạn đã đầu vào thú vị. – yCalleecharan

-7

malloc khác nhau bởi calloc bởi hai lý do

  1. malloc mất một đối số trong khi calloc mất hai lập luận

  2. malloc là nhanh hơn so với lý do calloc là malloc xử lý mảng chiều duy nhất để định dạng con trỏ trong khi calloc lấy mảng hai chiều và trước khi xử lý nó chuyển đổi thành mảng đơn chiều thành định dạng con trỏ.

Tôi nghĩ rằng, đó là lý do tại sao malloc xử lý nhanh hơn so với calloc

Các vấn đề liên quan