Thúc đẩy một khoảng thời gian mà mọi người có thể thử bất kỳ ý tưởng nào để làm cho phần mềm chạy nhanh hơn?


17

Đôi khi các thủ thuật hiệu suất phần mềm được tìm thấy từ một tìm kiếm phương pháp và kỹ lưỡng. Đôi khi nó đòi hỏi suy nghĩ khác biệt và can đảm để thử những ý tưởng điên rồ. Đôi khi một ý tưởng chỉ là khởi đầu cần phải được thực hiện với rất nhiều công việc khó khăn.

Làm cách nào để thúc đẩy một khoảng thời gian mà mọi người có thể thử các ý tưởng khác nhau để cải thiện hiệu suất của phần mềm chúng tôi đang làm việc? Mọi người trong nhóm có ít nhất vài tháng kinh nghiệm với phần mềm và rất giỏi về nó.

Bạn có đồng ý rằng suy nghĩ khác biệt sẽ giúp tìm ra cách cải thiện hiệu suất phần mềm? Tại sao? Tại sao không?

Những kỹ thuật nào sẽ cho phép chúng tôi nhanh chóng thử một ý tưởng tối ưu hóa? Là tốc độ mã hóa nhanh cần thiết để có được kết quả tốt từ thử?

Cuối cùng, nên phân bổ bao nhiêu "thời gian" để đảm bảo kết quả tốt mà không tạo ra khả năng chùng bước?

Thử nghiệm có cần thiết để chứng minh rằng "một cách nhanh hơn để làm một cái gì đó" tồn tại không? (Đã thêm 2011-06-07)

Liên quan:

( Chỉ dành cho mục đích tiền thưởng -2011/06/07, quy mô nhóm là 2-4 nhà phát triển, không có QA chuyên dụng. Tất cả mã, kiểm tra đơn vị và kiểm tra hiệu suất được thực hiện bởi các nhà phát triển. Vì bản chất của dự án, kết quả profiler rất hữu ích trong việc hiển thị thời gian thực hiện theo tỷ lệ ngay cả khi nó không tiết lộ một nút cổ chai.)


Khi bạn nói cải thiện hiệu suất, bạn đang nói nghiêm túc từ góc độ hiệu suất / điểm chuẩn, hoặc bạn có nghĩa là giao diện người dùng trực quan hơn, quy trình làm việc tốt hơn, v.v., tức là một sản phẩm tốt hơn?
Richard

Có thể liên quan đến Tech Talk. Nó thảo luận về những nỗ lực của một số công ty phần mềm để làm một việc như vậy.
ProdigySim

Cá nhân tôi sẽ viết nhiều bài kiểm tra hiệu suất chứng minh mà không mơ hồ về việc một thứ gì đó nhanh hay chậm như là một chức năng của một thứ khác.
Công việc

Câu trả lời:


21

Đặt cược tốt nhất của bạn là xác định các điểm nóng bằng một hồ sơ và - với tư cách là một nhóm - thảo luận về cách khắc phục các điểm nóng.

Bạn phải có khả năng đo lường và ghi lại sự cải thiện (để nó không chỉ là phỏng đoán hoang dã) và thực hiện nó như một nhóm đảm bảo rằng mọi người biết những gì đang được sửa chữa và làm thế nào.

Việc các lập trình viên đột nhập vào codebase để thử các ý tưởng có nghĩa là bạn không kiểm soát được những gì đang diễn ra và liệu nó có hoạt động không.


6

Các lập trình viên có xu hướng thông minh và sáng tạo (vì đây là điều kiện tiên quyết để có thể lập trình tốt), vì vậy, thật tốt khi để họ thử một loạt các ý tưởng khi cố gắng giải quyết vấn đề. Tuy nhiên, có hai điều quan trọng cần nhớ khi cố gắng cải thiện hiệu suất (tôi giả sử với "hiệu suất" bạn có nghĩa là giảm tốc độ thực hiện):

  • Tối ưu hóa thuật toán có xu hướng hoạt động tốt hơn nhiều so với bất cứ điều gì khác. Như một ví dụ tầm thường, bất cứ điều gì bạn làm đối với việc triển khai bong bóng của mình, với số lượng đủ, việc triển khai quicksort cực kỳ chậm cuối cùng sẽ nhanh hơn.
  • Làm bất cứ điều gì liên quan đến hiệu suất là hoàn toàn vô nghĩa trừ khi bạn đo lường (hồ sơ) và dựa trên bất cứ điều gì bạn làm trên kết quả.

Quan điểm chính của tôi là điều quan trọng là đảm bảo bạn ở cùng một trang với mọi người về những điều này trước khi bạn bắt đầu một giai đoạn thử nghiệm hoang dã . Sau đó, thật xấu hổ khi phát hiện ra rằng đồng nghiệp ít kinh nghiệm của bạn đã thử những thứ không bao giờ có thể làm được (và bạn có thể nói với họ điều đó trước).


1

Đáng buồn thay, tôi không thể nói từ kinh nghiệm. Nhưng tôi nghe nói rằng Atlassian có một ngày mà nhân viên được phép làm việc của riêng họ, bất cứ điều gì họ muốn và trình bày ý tưởng của họ trong một bầu không khí tiệc tùng. Nó bật ra tốt cho họ rõ ràng. Nhưng tôi phải đồng ý với Andersen và nói rằng khi nói đến hiệu suất, các ý tưởng sáng tạo và vượt trội ít quan trọng hơn sau đó định hình những quy trình mất nhiều thời gian nhất. Có lẽ một khi bạn đã lập hồ sơ hệ thống của mình, bạn có thể cho mọi người một ngày để đưa ra ý tưởng về cách giúp tăng tốc các phần quan trọng của quy trình. Sau khi họ trình bày ý tưởng của mình, bạn có thể chọn những ý tưởng để thử.


1

Một thực tế thành công mà chúng tôi đã thực hiện đối với một số đội trước đây của tôi là có khái niệm Deep Dives. Một vài người sẽ gặp nhau trong phòng hội thảo, xác định một số tình huống người dùng và chỉ cần bắt đầu bước qua mã hoặc xem nhật ký hồ sơ. Trong một số trường hợp, dữ liệu rõ ràng cho thấy các nút thắt cho phép chúng tôi thuyết phục những người hoài nghi rằng thực sự có vấn đề hoàn hảo trong mã của riêng họ! Để thực hiện thành công này, có một số nguyên lý chính mà chúng tôi đã theo dõi:

  1. Cố gắng tập trung vào các kịch bản quan trọng hoặc đường dẫn mã nơi nghi ngờ tắc nghẽn. Đừng lãng phí thời gian trong việc tối ưu hóa những thứ không cần phải tối ưu hóa (nếu nó không bị hỏng ...)
  2. Giữ cho nhóm nhỏ và tập trung vào những người biết mã tốt nhất. Đừng quên bao gồm người kiểm tra và người quản lý chương trình của tính năng - họ có những hiểu biết chính và có thể hưởng lợi từ việc tham gia hoặc thu thập thông tin về cách họ có thể kiểm tra tốt hơn.
  3. Bắt đầu phiên bằng cách chủ sở hữu khu vực đưa ra sơ đồ cấp khối kiến ​​trúc cấp cao và tổng quan về khu vực. Các thành phần chính là gì và mô tả ngắn gọn những gì họ làm. Bạn sẽ ngạc nhiên bao nhiêu lần sơ đồ khối không phản ánh đúng thực tế khi chúng ta đào sâu vào mã. (Trích dẫn thực tế: "Tôi không biết chúng tôi vẫn sử dụng thành phần đó. Tôi nghĩ rằng chúng tôi đã thoát khỏi những năm trước!")
  4. Mong đợi để tìm lỗi chức năng cũng như các vấn đề hoàn hảo. Đó là một điều tốt. Ngoài ra, hy vọng rằng, đôi khi, bạn sẽ không tìm thấy bất cứ điều gì quan trọng. Đó cũng có thể là một điều tốt.
  5. Dự kiến ​​sẽ có một vài phiên dài. Đây là những cuộc họp làm việc. Hãy thoải mái, và làm việc thông qua nó. Bạn sẽ làm được nhiều việc hơn khi tất cả các bạn có thể hợp tác cho các trải dài.
  6. Ghi chép, ghi chú tốt. Nếu bạn sử dụng cơ sở dữ liệu theo dõi lỗi, hãy xem xét mở các vấn đề ngay lập tức để theo dõi, ngay cả khi chúng có mức độ ưu tiên thấp.

Tránh để toàn bộ nhóm tham gia vào "Đẩy hiệu suất". Chúng thường không có kết quả mà ban quản lý mong đợi vì những lý do mà Thorbjørn Ravn Andersen đã đề cập trong một câu trả lời khác. Bạn sẽ nhận được lợi nhuận lớn trong một số lĩnh vực, hồi quy ở những khu vực khác mà mọi người không quen thuộc và thật khó để dự đoán / theo dõi số tiền bạn nên nhận được khi nói "bạn đã hoàn thành". Đó là một cuộc trò chuyện đầy thách thức với quản lý.


0

Lý do tại sao bạn có thể cần cải thiện tốc độ của phần mềm là nếu một cái gì đó trong đó chậm đáng chú ý. Nếu đó không phải là trường hợp, thì tối ưu hóa là một sự lãng phí thời gian. Nhưng nếu một cái gì đó chậm, sau đó làm nhiệm vụ.

... Và để thực hiện nhiệm vụ, có hai bước theo thứ tự này:

  1. Xem nếu chức năng đang thực hiện nhiệm vụ được viết một cách hiệu quả. Nó có một thuật toán tốt hay kém? Có phải nó đang truy cập một cơ sở dữ liệu một cách hiệu quả. Là nó lặp 100 lần khi một lần có thể làm gì? Thông thường, kiểm tra mã đơn giản có thể tìm thấy một trở ngại và không chỉ khắc phục nó, mà còn giúp bạn trở thành một lập trình viên tốt hơn cùng một lúc.

  2. Đừng dành nhiều hơn một giờ cho số 1. Nếu bạn không thể tìm thấy vấn đề trong một giờ, thì hãy sử dụng một hồ sơ để tìm vị trí được đề cập. Khi bạn biết điểm vấn đề, bạn có thể quay lại số 1 và thực hiện lại, tìm ra cách tốt nhất để cải thiện mã mà bạn đã xác định.


0

Nói chung (**) bạn không có được hiệu suất tốt hơn bằng thử nghiệm.

Bạn nhận được nó bằng cách

  • Biết cách làm cho một thiết kế đơn giản, hiệu quả để bắt đầu. Nếu bạn hiểu sai phần này, thử nghiệm sẽ không có nhiều khác biệt. Ví dụ, biết cách nhận biết khi sử dụng trình tạo mã là phương pháp thiết kế chiến thắng.

  • Biết cách điều chỉnh phần mềm bằng cách định vị các hoạt động a) đắt tiền trên cơ sở tỷ lệ phần trăm và b) có thể thay thế bằng thứ gì đó tốt hơn. Mọi người đều biết bạn nên "sử dụng một hồ sơ", nhưng điều đó là không đủ.

Kiểm tra câu trả lời này cho câu hỏi khác của bạn.

** Các ngoại lệ có thể là mã phụ thuộc phần cứng chặt chẽ, như kết xuất đồ họa, đường ống xử lý hoặc hành vi CUDA hoặc thử nghiệm các giao thức mạng hoặc DB, nơi bạn chỉ cần làm quen với cách tốt nhất để sử dụng nó.

THÊM: Có một điều mà nhiều lập trình viên của các hệ thống lớn thấy ngạc nhiên. Đó là trong các chương trình lớn được xây dựng hoàn hảo, có thể có các vấn đề hiệu suất lớn, vô hình và các trình định dạng không thể tìm thấy chúng vì chúng không được định vị theo thói quen. Chúng là một phần của cấu trúc chung của chương trình, mặc dù chương trình có thể được thực hiện theo phong cách tốt nhất.

Chỉ cần đưa ra một ví dụ cụ thể, đây là một chương trình với mã nguồn (trong C ++) thực hiện công việc. Nó được chắt lọc từ một chương trình C thực sự mà tôi đã làm việc.

Nó làm những gì nó dự định làm, nhưng phần nào thời gian của nó không thực sự cần thiết? Bao nhiêu nó có thể được tăng tốc?

Chà, trong phiên bản đầu tiên của chương trình, một cái gì đó hoàn toàn hợp lý và không nhắm mục tiêu (vô hình đối với một hồ sơ) đã chiếm 33,3% thời gian. Khi nó được thay thế, thời gian đó đã được lưu và đó là phiên bản thứ hai của chương trình.

Trong phiên bản thứ hai của chương trình, một cái gì đó khác (vô hình với bất kỳ trình lược tả nào) có thể được gỡ bỏ đang chiếm 16,7% thời gian. Loại bỏ nó dẫn đến phiên bản 3.

Trong phiên bản 3, 13% đã bị xóa. Trong số những gì còn lại, 66% đã được gỡ bỏ. Trong số những gì còn lại sau đó, 61% đã bị xóa!

Cuối cùng, trong số những gì còn lại sau đó, 98% đã bị xóa!

Vậy bức tranh lớn là gì? Trong số 1000 chu kỳ dành cho chương trình ban đầu, có bao nhiêu đã bị xóa? 998!

Mỗi chương trình đều khác nhau, nhưng theo tôi, mỗi chương trình lớn đều có một loạt vấn đề mất thời gian mà các trình biên dịch sẽ không tìm thấy, việc lấy mẫu thủ công sẽ và nếu lập trình viên thực sự đạt hiệu suất tối đa, có thể được loại bỏ cho tăng tốc lớn.


Để làm cho câu trả lời của bạn tự đứng vững hơn, bạn có thể muốn giải thích những gì đã được thay thế trong các phiên bản khác nhau, thực sự là.

@ Thorbjørn: Đó là tất cả trong dự án, và được tóm tắt trong trình chiếu PDF, và như tôi đã nói, mọi chương trình đều khác nhau. Điều duy nhất giống nhau là phương pháp.
Mike Dunlavey
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.