2010-10-16 32 views
5

Tôi hiện đang viết lại một trong các chương trình của mình. Nó có một chức năng rất nhiều đệ quy mà giải quyết peg-solitaire:C: Nhanh hơn, truy cập biến toàn cục hoặc chuyển con trỏ đến hàm

int solve(int draw) { 
    if (finished()) 
    return true; 

    //loop over every possible move (about 76 long values) 
    //do a move (access the board, which is a long value) 
    if (solve(draw + 1)) 
    return true; 

    return false; 
} 

Vì vậy, tôi đã tự hỏi nếu nó nhanh hơn để sử dụng giải quyết như thế này:

solve(int draw, long **moves, long *board) {} 

Tại thời điểm cả hai di chuyển và hội đồng quản trị là các biến toàn cầu.

Tất nhiên tôi sẽ thử nghiệm nó, nhưng nếu ai đó nói với tôi rằng nỗ lực này sẽ không hiệu quả tôi sẽ tiết kiệm thời gian :).

Trân trọng

+1

Quy tắc tối ưu đầu tiên là, bạn không nói về Tối ưu hóa. –

Trả lời

9

Nó có thể sẽ không hiệu quả, nhưng cách duy nhất để biết chắc chắn là lập hồ sơ cho mã của bạn. Nếu phần lớn thời gian thực hiện của bạn được sử dụng để thực hiện logic trò chơi thực tế của bạn, thì số lượng nhỏ trên không đặt một vài đối số trên ngăn xếp sẽ không đáng kể.

Tuy nhiên, từ quan điểm thiết kế, tránh biến toàn cầu tốt hơn nhiều. Nó cho phép mã của bạn trở thành không trạng thái, và do đó có khả năng tái nhập và an toàn luồng. Tuy nhiên, điều này có thể hoặc có thể không liên quan đến ứng dụng của bạn.

+1

Các lợi ích khác để tránh globals là kiểm tra đơn vị được dễ dàng hơn. –

1

Có một số chi phí nhất định với các tham số truyền tới hàm - viết tham số cho ngăn xếp. Trong đa số (có thể là tất cả) của kiến ​​trúc hiện đại ngăn xếp acess và truy cập dữ liệu toàn cầu có cùng tốc độ, vì vậy hầu hết các tham số truyền qua sẽ chậm hơn một chút.

+0

Có một số kiến ​​trúc vượt qua đối số hàm trong thanh ghi CPU. Tuy nhiên, tăng hiệu suất liên quan được loại bỏ nếu bạn đang sử dụng hàm đệ quy. –

2

Điều này có vẻ như tối ưu hóa quá sớm!

Mỗi khi bạn gọi giải quyết(), bạn phải kiểm tra xem bạn đã hoàn thành() chưa. Chi phí của việc hoàn thành() kiểm tra sẽ thổi bay bất kỳ sự khác biệt trong thời gian truy cập biến.

Làm cho nó chính xác trước, sau đó cấu hình nó nếu nó quá chậm, sau đó tối ưu hóa!

2

Tôi không nghĩ đây là nút cổ chai hiệu suất.

Điều duy nhất đến với tâm trí của tôi với mã bạn hiển thị là:

Bạn có cần các biến dài dài không? Chúng thường cần nhiều không gian hơn, có nghĩa là cần nhiều thời gian hơn để sử dụng chúng. Tôi nhớ một khi tôi đã thay thế các biến kép bằng các biến số float và tôi nhận được một tăng BIG (50% thời gian thực hiện ít hơn). Điều này có thể giúp một chút :)

+0

Thật không may có, bảng peg có thể giữ 33 chốt, đó là lý do tại sao tôi cần nhiều hơn sau đó 32 bit: ( – imbaer

+0

Tôi khá chắc chắn rằng 'long long' - nếu chúng được lấy làm số nguyên 64 bit - sẽ không chậm hơn so với các CPU hiện đại hơn bất kỳ thứ gì khác. –

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