2012-02-17 31 views
7

Tôi đang thực hiện một số phân tích cú pháp đệ quy.Là một ngăn xếp giả nhanh hơn một chồng thực

Hiện tại tôi có một ngăn xếp giả, nơi tôi lưu trữ trạng thái cho máy trạng thái hữu hạn của mình, vì vậy khi tôi đi xuống đệ quy, tôi đẩy trạng thái của mình vào và sau đó đã xử lý xong đoạn văn bản đệ quy .

Nó sẽ được nhanh hơn để có một 'id trạng thái' chồng như:

int* stack = 0 
int top = 0; 
// ... 
// drill down bit 
if (stack == 0) 
    stack = (int*)malloc(STACK_JUMP_SIZE); 
else if (top % STACK_JUMP_SIZE == 0) 
    stack = (int*)realloc(stack, (top+STACK_JUMP_SIZE) * sizeof(int)); 
stack[top++] = currentState; 
// ... 
// pop up later 
{currentState = stack[--top]; { 
if (top == 0) { 
    free(stack); 
    stack = 0; 
} else if ((top+1) % STACK_JUMP_SIZE == 0) { 
    stack = (int*)realloc(stack, (top+1)*sizeof(int)); 
} 

Hoặc nó sẽ là nhanh hơn để phân chia các điều lên thành các hàm thích hợp và để cho C++ lo lắng về chồng.

(Tôi biết ai đó sẽ cho tôi biết 'đó là C, nó không phải là C++', vì vậy tôi trả lời trước một cách trống rỗng, chương trình C++ của tôi nhưng có rất nhiều c trong đó).

+0

Cá nhân tôi sẽ mong đợi các chức năng bình thường sẽ nhanh hơn .. nhưng ai đó nghĩ nhiều hơn tôi nghĩ rằng việc xếp chồng giả này nhanh hơn. Bây giờ tôi muốn xem thêm ý kiến ​​từ những người điều hơn tôi :) – matiu

+1

@matu Nó phụ thuộc vào máy. Trên Sparc, một cuộc gọi hàm yêu cầu truy cập bộ nhớ bằng không, và có thể nhanh hơn đáng kể. Trên Intel, bạn sẽ tiết kiệm được địa chỉ trả về và con trỏ khung trong bộ nhớ, cộng với bất kỳ đối số nào mà hàm yêu cầu: có thể rất tốn kém. –

Trả lời

9

Phụ thuộc vào việc triển khai — không có cách nào để nói trước. Trên máy có các cuộc gọi hàm giá rẻ (ví dụ: SPARC), chức năng ngăn xếp có thể nhanh hơn, nhưng ngay cả ở đó, các vấn đề như nội địa hoá được can thiệp. (Ngăn xếp máy chiếm nhiều chỗ hơn, vì nó ngăn xếp thêm thông tin , so với chồng mô phỏng của bạn). Tôi muốn chia nhỏ thành các hàm đệ quy thích hợp và chỉ thử quản lý ngăn xếp thủ công nếu điều này chứng minh là nút cổ chai. Trừ khi ... Quản lý ngăn xếp thủ công có một lợi thế quan trọng: xử lý lỗi. Máy tràn ngăn xếp là hành vi không xác định: nếu malloc hoặc realloc trả về một con trỏ rỗng, bạn ít nhất có thể báo cáo lỗi một cách rõ ràng.

Nếu bạn làm mô phỏng các ngăn xếp, bạn nên xem xét sử dụng std::vector, và không malloc/realloc/free. Nó sẽ giúp bạn tiết kiệm nếu có một ngoại lệ và nó cũng có khả năng nhanh hơn một chút. Nếu bạn có thể đặt giới hạn trên cho kích thước ngăn xếp và không lớn đến mức không hợp lý, hãy tuyên bố ngăn xếp dưới dạng mảng kiểu C trên ngăn xếp sẽ thậm chí còn nhanh hơn .

+5

Hoặc một 'std :: stack', thậm chí. –

+0

@SteveJessop Điểm tốt. Nếu không có gì khác, tên của nó là một biểu hiện của ý định (mà lần lượt tạo điều kiện cho sự hiểu biết mã). –

+0

Cảm ơn James. Ban đầu tôi đã sử dụng véc tơ và thấy nó hơi chậm hơn. Tôi nghĩ bởi vì nó đã được tái phân bổ nhiều hơn; mà tôi chắc chắn có thể được sửa đổi mặc dù. Cảm ơn Steve. Tôi sẽ xem xét std :: stack. – matiu

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