2009-07-04 42 views
7

Tôi đang làm việc trong môi trường và lập trình của Google App Engine bằng Python. Tôi đang tạo một hàm về cơ bản tạo ra một chuỗi ký tự/số ngẫu nhiên và sau đó lưu trữ vào memcache.Không tạo các chức năng riêng biệt thay vì một chức năng xử lý chậm nhất?

def generate_random_string(): 
# return a random 6-digit long string 

def check_and_store_to_memcache(): 
    randomstring = generate_random_string() 
    #check against memcache 
    #if ok, then store key value with another value 
    #if not ok, run generate_random_string() again and check again. 

Tạo hai hàm thay vì chỉ một hàm lớn ảnh hưởng đến hiệu suất? Tôi thích hai, vì nó phù hợp hơn với suy nghĩ của tôi, nhưng đừng ngại kết hợp chúng nếu đó là "thực hành tốt nhất".

+0

Bạn có thể thụt lề với 4 dấu cách để mã hiển thị chính xác. –

Trả lời

28

Tập trung vào việc có thể đọc và dễ dàng hiểu mã của bạn.

Khi bạn đã thực hiện việc này, nếu bạn gặp sự cố về hiệu suất, hãy xem xét những gì có thể gây ra sự cố.

Hầu hết các ngôn ngữ, bao gồm python, có xu hướng có chi phí khá thấp để thực hiện cuộc gọi phương thức. Đưa mã này vào một hàm duy nhất sẽ không thay đổi (đáng kể) các chỉ số hiệu suất - tôi đoán rằng việc tạo số ngẫu nhiên của bạn có thể sẽ là phần lớn thời gian, không có 2 hàm.

Điều đó đang được nói, chức năng tách có tác động (rất, rất nhỏ) về hiệu suất. Tuy nhiên, tôi nghĩ về nó theo cách này - nó có thể đưa bạn đi 80 mph trên đường cao tốc đến 79,99mph (mà bạn sẽ không bao giờ thực sự nhận thấy). Những điều quan trọng cần theo dõi là tránh đèn pha và ùn tắc giao thông, vì chúng sẽ khiến bạn phải dừng lại hoàn toàn ...

+0

+1, lời khuyên rất tốt. –

+5

Bạn đã không đề cập rằng tối ưu hóa sớm tạo ra nhiều vấn đề hơn là giải quyết. –

+0

Ông đã làm việc trong một chiếc xe rắn tương tự mặc dù. +1 cho phong cách! – Eric

4

Reed là đúng. Đối với thay đổi bạn đang xem xét, chi phí của cuộc gọi hàm là một số lượng nhỏ các chu kỳ và bạn phải thực hiện nó 10^8 lần hoặc hơn mỗi giây trước khi bạn nhận thấy.

Tuy nhiên, tôi sẽ cảnh báo rằng mọi người thường đi đến thái cực khác, và sau đó là như thể các cuộc gọi chức năng là tốn kém. Tôi đã thấy điều này trong các hệ thống được thiết kế quá mức, nơi có nhiều lớp trừu tượng.

Điều gì xảy ra là có một số tâm lý con người nói rằng nếu một cái gì đó dễ gọi, thì nó nhanh. Điều này dẫn đến việc viết nhiều cuộc gọi hàm hơn là cần thiết, và khi điều này xảy ra trên nhiều lớp trừu tượng, sự lãng phí có thể là theo cấp số mũ.

Sau ví dụ lái xe của Reed, cuộc gọi hàm có thể giống như đường vòng và nếu đường vòng có đường vòng, và nếu đường vòng có đường vòng, sẽ có rất nhiều thời gian lãng phí, vì không có lý do rõ ràng, vì mỗi chức năng gọi trông vô tội.

14

Trong hầu hết các trường hợp, chức năng "nội tuyến" để tăng tốc độ giống như cắt tóc để giảm cân.

+8

++ Ẩn dụ tuyệt vời! –

2

Giống như những người khác đã nói, tôi sẽ không lo lắng về điều đó trong trường hợp cụ thể này. Các chi phí rất nhỏ liên quan đến các cuộc gọi chức năng sẽ nhạt so với những gì được thực hiện bên trong mỗi chức năng. Và miễn là các chức năng này không được gọi trong kế tiếp nhanh chóng, nó có lẽ sẽ không quan trọng nhiều anyway.

Đó là một câu hỏi hay. Trong một số trường hợp, tốt nhất là không chia mã thành nhiều hàm. Ví dụ, khi làm việc với các tác vụ toán học chuyên sâu với các vòng lồng nhau, tốt nhất là thực hiện càng ít các cuộc gọi hàm càng tốt trong vòng lặp bên trong. Đó là bởi vì các hoạt động toán học đơn giản là rất rẻ, và bên cạnh đó chức năng gọi-overhead có thể gây ra một hình phạt hiệu suất đáng chú ý.

Năm trước, tôi phát hiện ra chức năng hypotenuse (hypotenuse) trong thư viện toán học mà tôi đang sử dụng trong ứng dụng VC++ rất chậm.Nó có vẻ vô lý đối với tôi bởi vì nó là một tập hợp các chức năng đơn giản như vậy - trả về sqrt (a * a + b * b) - mức độ khó như thế nào? Vì vậy, tôi đã viết của riêng mình và quản lý để cải thiện hiệu suất 16X hơn. Sau đó, tôi đã thêm từ khóa "inline" vào hàm và làm cho nó nhanh hơn 3 lần so với (khoảng 50X nhanh hơn tại thời điểm này). Sau đó, tôi lấy mã ra khỏi chức năng và đặt nó trong vòng lặp của tôi và thấy một sự gia tăng hiệu suất nhỏ. Vì vậy ... vâng, đó là các loại tình huống mà bạn có thể thấy sự khác biệt.

+0

Nó sẽ không phải là sqrt (a * a + b * b)? –

+0

Ah vâng, bắt tốt. –

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