Là microoptimization có giá trị nó trong các thiết bị di động?


8

Thông thường, vi mô hóa được coi là không có giá trị với lời giải thích sau: nó có thể tăng tốc chương trình ít hơn một phần trăm, nhưng không ai quan tâm đến sự gia tăng nhỏ đó - đó chỉ là quá ít thay đổi để được chú ý.

Hơn nữa, có thể có một số trình xử lý sự kiện bắn một nghìn lần mỗi giây và thoát ra rất nhanh - trước khi nó được bắn lại. Không ai quan tâm nó nhanh đến mức nào - làm cho nó nhanh hơn không thể được ghi nhận, bởi vì nó đã "nhanh như có thể quan sát được".

Tuy nhiên, trong thiết bị di động, tiêu thụ năng lượng là một yếu tố quan trọng. Trình xử lý sự kiện tương tự được tối ưu hóa để chạy nhanh hơn mười phần trăm sẽ dẫn đến tiêu thụ ít năng lượng hơn và đó là thời lượng pin dài hơn và thiết bị hoạt động lâu hơn.

Làm thế nào chính xác là phán đoán sau về các thiết bị di động? Có bất kỳ ví dụ thực tế cuộc sống nào xác nhận hoặc từ chối nó?


3
IMHO, như với tối ưu hóa nói chung, bạn chỉ có thể nhận được câu trả lời đáng tin cậy thông qua các phép đo. Nhưng câu hỏi vẫn tốt, +1 :-)
Péter Török

1
Xác định các điều khoản của bạn. Tôi có ấn tượng rằng bạn đang nói về tối ưu hóa vi thời gian chạy và bạn đặc biệt đề cập đến việc sử dụng năng lượng, nhưng trong bối cảnh các thiết bị nhỏ không phải là những thứ duy nhất có thể đáng để tối ưu hóa. Kích thước thực thi và dấu chân bộ nhớ là những người khác.
Peter Taylor

Câu trả lời:


12

Nó đáng giá nếu các phép đo nói rằng nó đáng giá. Đối với thiết bị di động cũng như siêu máy tính.

EDIT: Ít chủ đề, nhưng về ví dụ của bạn. Nếu sự kiện được kích hoạt quá nhiều lần, thì bạn có vấn đề về thụ thai và giải quyết vấn đề thụ thai đó là vấn đề thực sự. Không làm cho nó ít nhìn thấy hơn bằng cách vi mô hóa.

Ví dụ, bạn có thể thực hiện kiểm tra trong cuộc gọi lại để loại bỏ các cuộc gọi quá thường xuyên hoặc làm lại cách gọi lại.

Nói chung, việc đính kèm gọi lại với «các sự kiện liên tục» là một thực tế tồi. Do đó, ý tôi là các sự kiện không kích hoạt một lần và sau đó được thực hiện, nhưng điều đó kích hoạt hành động kéo dài theo thời gian.

Cuộn một trang hoặc một thanh trượt, ví dụ, là các sự kiện liên tục.

Bạn không bao giờ biết bao nhiêu lần những sự kiện đó sẽ được kích hoạt. Nếu chúng được kích hoạt đủ nhanh, ứng dụng của bạn sẽ bị lag và nếu chúng được kích hoạt quá nhiều lần, bạn sẽ không tải được CPU lớn, không có khả năng khiến ứng dụng của bạn bị lag.


Được rồi, tôi đo cái gì - Tiêu thụ điện năng hay bất cứ thứ gì khác?
sharptooth

4
Đo lường những gì quan trọng cho người dùng của bạn. Nếu tiêu thụ là một vấn đề (và nó là trên thiết bị di động) thì hãy đo nó và hành động theo các phép đo.
deadalnix

Điều gì về các cân nhắc thương mại - có lợi nhuận để thực hiện tối ưu hóa? Pin lớn hơn có thể rẻ hơn thời gian kỹ thuật cho các sản phẩm có khối lượng trung bình thấp. Giao diện người dùng chậm hơn với thời lượng pin ít hơn 5% sẽ tốt hơn so với không có sản phẩm nào trên thị trường. Thật dễ dàng để đốt cháy $$$ không bao giờ đạt được sự hoàn hảo.
mattnz

2

Làm thế nào chính xác là phán đoán sau về các thiết bị di động?

Nó chỉ chính xác như các phép đo thực tế trên thiết bị thực tế thực sự chỉ ra rằng tối ưu hóa thực tế sẽ thực sự có ích.

Giả định và đánh giá là vô giá trị.

Các phép đo có giá trị.

Tất cả tối ưu hóa (bao gồm cả "vi mô hóa", dù đó là gì) đều lãng phí thời gian cho đến khi có một phép đo thực tế chỉ ra một vấn đề thực tế trong đó mã thực sự không đáp ứng một số yêu cầu (về tốc độ, bộ nhớ, độ trễ hoặc độ trễ mạng hoặc bất cứ điều gì ).


2

(Giả sử tốc độ là vấn đề chính của bạn.) Mọi người đều đúng.
Ngoại trừ - phép đo sẽ không cho bạn biết những gì cần tối ưu hóa.

Đo lường sẽ cho bạn biết rằng bạn cần phải tối ưu hóa.
Đo lường sẽ cho bạn biết bạn đã tiết kiệm được bao nhiêu khi tối ưu hóa.

Đo lường sẽ không cho bạn biết những gì để tối ưu hóa.
Kỹ thuật này sẽ cho bạn biết những gì để tối ưu hóa.


2
Không cấu hình tốt hơn kỹ thuật lấy mẫu ngẫu nhiên này?
S.Lott

2
@ S.Lott q: xem bức tranh tường từ hai khối cách tốt hơn xem nó từ hai feet? a: bạn thực sự không nhìn thấy bức tranh tường khi nhìn từ một góc độ duy nhất. cả hai đều quan trọng lấy mẫu / định hình có thể là một sự lãng phí rất lớn thời gian nếu đó là viễn cảnh duy nhất bạn từng thực hiện để đánh giá hiệu suất chương trình của mình.
justin

@Justin: "lấy mẫu / định hình có thể là một sự lãng phí rất lớn thời gian nếu ..."? Gì? Bạn đã cung cấp một liên kết về lấy mẫu, như thể hồ sơ không tốt như lấy mẫu. Bây giờ bạn đang nói cả hai đều có khả năng xấu? Sự lựa chọn thứ ba, khác với việc lấy mẫu trong liên kết và hồ sơ (có vẻ đầy đủ và hữu ích hơn đối với tôi)? Nếu có lựa chọn thứ ba, bạn có thể cập nhật câu trả lời của mình để giải thích làm thế nào tất cả các lựa chọn này khớp với nhau không? Tôi vẫn chưa rõ về những gì sai với hồ sơ. Liên kết không giải thích tại sao lấy mẫu tốt hơn.
S.Lott

@ S.Lott: Tôi biết đó là một quan điểm thiểu số, nhưng một số người đã thử và đồng ý. Nếu tôi có thể tạo ra một sự tương tự, các nhà khảo cổ sử dụng dụng cụ cầm tay và bàn chải, bởi vì các chi tiết tốt là quan trọng, và họ cần phải hiểu chúng. Các hồ sơ duy nhất tôi biết rằng được đóng là zoom . Và nếu bạn thử nó, bạn sẽ thấy nó vẫn khá khác biệt, bởi vì nó tập trung vào sự hiểu biết . Đây là phương pháp được sử dụng ở đây .
Mike Dunlavey

@Mike Dunlavey: "đã thử và đồng ý"? Nó là gì? Lấy mẫu? Hồ sơ? Hoặc bất cứ lựa chọn thứ ba nào là khi "lấy mẫu / định hình có thể là một sự lãng phí rất lớn thời gian nếu ..."? Bạn đang nói hồ sơ công việc? Hoặc hồ sơ đòi hỏi các công cụ đặc biệt?
S.Lott

1

Tôi quen với việc tối ưu hóa. tôi thấy các chương trình của người khác với một đôi mắt khác - đây là của tôi:

Thông thường, vi mô hóa được coi là không có giá trị với lời giải thích sau: nó có thể tăng tốc chương trình ít hơn một phần trăm, nhưng không ai quan tâm đến sự gia tăng nhỏ đó - đó chỉ là quá ít thay đổi để được chú ý.

Điều buồn cười là, một thay đổi như vậy dẫn đến 99%. mười thay đổi như vậy làm cho chương trình nhanh hơn đáng chú ý. đối với nhiều kỹ sư, những thay đổi trong cách tiếp cận viết chương trình của họ có thể khiến chương trình thực thi nhanh hơn nhiều lần. chỉ cần nhận thức được hiệu quả và viết theo cách đó có thể làm cho chương trình của bạn nhanh hơn nhiều lần mà không cần phải làm thêm. lợi ích như vậy không phải là tối ưu hóa vi mô, imo.

lưu ý: tôi không bao giờ đề xuất tối ưu hóa theo ngữ cảnh theo ngữ cảnh trong cuộc thảo luận này.

Hơn nữa, có thể có một số trình xử lý sự kiện bắn một nghìn lần mỗi giây và thoát ra rất nhanh - trước khi nó được bắn lại. Không ai quan tâm nó nhanh đến mức nào - làm cho nó nhanh hơn không thể được ghi nhận, bởi vì nó đã "nhanh như có thể quan sát được".

và có khả năng nó đã thực hiện nhiều công việc hơn mức cần thiết vì 1kHz cao hơn nhiều so với nhiều trường hợp yêu cầu. nguồn xử lý sự kiện này là gì và tác dụng của nó là gì? nếu chỉ đơn giản là cập nhật giao diện người dùng và các sự kiện có thể được thu thập và kết hợp lại, thì công văn 1kHz chắc chắn là quá mức cần thiết (hơn 1% - giống như 25x). đối với một hệ thống có các nguồn mulitple và được truyền nối tiếp, thì 1kHz có thể không đủ nhanh (ví dụ MIDI).

Tuy nhiên, trong thiết bị di động, tiêu thụ năng lượng là một yếu tố quan trọng. Trình xử lý sự kiện tương tự được tối ưu hóa để chạy nhanh hơn mười phần trăm sẽ dẫn đến tiêu thụ ít năng lượng hơn và đó là thời lượng pin dài hơn và thiết bị hoạt động lâu hơn. Làm thế nào chính xác là phán đoán sau về các thiết bị di động? Có bất kỳ ví dụ thực tế cuộc sống nào xác nhận hoặc từ chối nó?

dựa trên các chương trình tôi đã xem, không có nhiều người xem xét (hoặc quan tâm đến) những tối ưu hóa đó, mặc dù việc thay đổi cách tiếp cận của bạn đối với các chương trình viết có thể mang lại lợi ích đáng kinh ngạc (> 10 hoặc nhanh hơn nhiều). nhiều thứ mà tôi đã thấy (ở phía phát triển ứng dụng) chỉ cần viết sau đó thực hiện phương pháp từ trên xuống hoặc "mưa đá" khi (/ nếu) các vấn đề về hiệu suất bắt kịp với chúng. tương tự như vậy, nhiều người thậm chí sẽ không dành thời gian để lập hồ sơ cho đến khi xảy ra như vậy. vào lúc đó, tiếng ồn của rất nhiều sự thiếu hiệu quả khiến cho việc lấy thông tin hữu ích từ một hồ sơ rất khó khăn. các ví dụ về phương pháp tiếp cận mưa đá sẽ là tối ưu hóa các khu vực sai (có hoặc không tìm kiếm các khu vực có vấn đề), hoặc chỉ ném thêm lõi vào các khu vực có vấn đề; điều này xảy ra thay vì sửa chữa sự thiếu hiệu quả hiện có.

đối với chương trình hiện có điển hình (trong số các chương trình di động tôi đã thấy), tối ưu hóa không phải là mối quan tâm cao khi nó được viết. vì vậy "có" chúng (trong trường hợp điển hình) đáng giá thời gian, miễn là nó nằm trong ngân sách và là một ưu tiên. trong trường hợp đó, mười thay đổi đó làm cho chương trình nhanh hơn đáng kể có thể được thực hiện trong vài giờ và ít hơn một ngày.

"Viết một cách lười biếng và hồ sơ khi nhìn lại" vì hành động duy nhất để cải thiện chương trình là một ý tưởng tồi tệ: dành thời gian để học cách viết một chương trình hiệu quả (vì nó được viết, chứ không phải bằng cách kết hợp nó vào cuối) cách tiếp cận (imo); sử dụng đúng thuật toán, cấm sao chép lãng phí, phân bổ, tính toán (+ nhiều, nhiều danh mục khác). Tất nhiên, phân tích hiệu suất khi nhìn lại có giá trị của nó, nhưng nếu bạn viết chương trình để có hiệu quả ngay từ đầu, bạn sẽ có một mức độ hiệu quả hoàn toàn mới bởi vì bạn học được nhiều và xem xét và đánh giá việc thực hiện từ nhiều khía cạnh.

một điều nữa là các chương trình nên (thường) được viết để sử dụng lại, một chương trình được viết kém sẽ đưa ra các thay đổi có thể phá vỡ chương trình của khách hàng khi không hiệu quả (hoặc vẫn không hiệu quả để tránh phá vỡ các chương trình hiện có).

Một lợi ích tuyệt vời của việc xem xét nó khi bạn viết là bạn có một ý tưởng rất rõ ràng về cách chương trình sẽ hoạt động (mặc dù không phải là một bức tranh hoàn chỉnh), bạn có thể sử dụng thông tin này để hỗ trợ thiết kế giao diện và cách lưu trữ dữ liệu của nó . sự thật là, một kỹ sư có thể thực hiện một cái gì đó nhanh hơn vài lần (ví dụ> 10 lần) so với các giải pháp "một kích thước phù hợp với tất cả" tiêu chuẩn được cung cấp với HĐH.

cuối cùng, nó cũng có giá trị vượt ra ngoài các thiết bị di động. Có rất nhiều chương trình không hiệu quả ngoài kia, được viết với suy nghĩ rằng phần cứng sẽ nhanh hơn trong hai năm (lý do thường xuyên, ngay cả đối với các chương trình được viết ngày hôm nay!). Trong khi đó không phải là không chính xác , nó quá lạc quan. đồng thời, song song hóa có mục đích nhưng đó là "giải pháp mặc định" sai cho nhiều chương trình. nhiều trong số các chương trình hiện tại có thể được cải thiện tốt nhất bằng cách loại bỏ sự thiếu hiệu quả hiện có trước tiên.

vì vậy ... thường có hàng tấn các trường hợp 1%, 2%, 7% (và tệ hơn nhiều) trong thế giới thực. sửa chúng hoặc (quan trọng hơn) không viết / phơi bày chúng ở nơi đầu tiên có thể mang lại lợi ích lớn. nhiều trường hợp có thể dễ dàng xác định vị trí và sửa chữa (với điều kiện kỹ sư có một số kinh nghiệm với việc này). tuy nhiên, nó thực sự có thể là một nỗi đau để sửa chữa và kiểm tra lại sau khi thực tế. nếu một chương trình là tối ưu, lý tưởng nhất là nó sẽ được viết theo cách đó ngay từ đầu.

với tư cách là người dùng cuối, thật khó chịu khi liên tục chờ đợi các chương trình chậm và ném hai lần phần cứng vào các vấn đề được tạo ra bởi các chương trình chậm / không hiệu quả: Q: "bạn sẽ làm gì bây giờ khi bạn có gấp đôi lõi và gấp đôi bộ nhớ?" Trả lời: "lấy lại khả năng đáp ứng và năng suất tôi có trước khi tôi nâng cấp phần mềm của mình - đó là về nó". khá bất cẩn của nhà phát triển (imho).


1
Dành thời gian để làm cho nó hoàn hảo là một sự sang trọng tốt đẹp đối với một số người. Một công ty mà tôi biết về việc tối ưu hóa vi mô là cách họ kinh doanh. Sản phẩm của đối thủ cạnh tranh của họ kém hơn về mọi mặt, chậm hơn và cần sạc lại thường xuyên hơn da da, nhưng người dùng có thể mua một cái với giá mà người dùng đã sẵn sàng trả .....
mattnz

@mattnz một ví dụ công bằng (+1). đối với hồ sơ, tôi không làm cho một chương trình hoàn hảo. bài viết của tôi nhấn mạnh thiết kế tốt với sự nhấn mạnh cao hơn và xem xét cho hiệu suất hơn là điển hình. để bảo vệ chi phí: bạn thường có thể đạt được sự cân bằng tốt giữa một chương trình được viết tốt, hoạt động tốt với các thành phần có thể được tái sử dụng dễ dàng so với thiết kế kém / kém hiệu quả có thời gian tồn tại tương đối ngắn. người ta phải tính chi phí bảo trì và nhận ra điểm mạnh và điểm yếu của từng thiết kế. (tiếp)
justin

. các chương trình được viết kém thường gây lãng phí nhiều thời gian / tài nguyên phát triển trong thời gian dài.
justin

1

Lý do tại sao bạn không nên bận tâm với tối ưu hóa vi mô là vì chúng là tối ưu hóa vi mô . Bạn nên nhìn vào bức tranh lớn hơn và thay vì lãng phí thời gian của bạn vào việc tối ưu hóa vi mô , hãy tìm lý do cho những cải tiến thực sự .

Nguyên tắc nhỏ của tôi là bất kỳ mã nào được viết mà không quan tâm đến tốc độ, nhưng cũng không hoàn toàn ngu ngốc, có thể được thực hiện nhanh hơn gấp mười lần với rất nhiều nỗ lực. 10% thông qua tối ưu hóa vi mô không phải là điều mà tôi sẽ bận tâm. Tôi chắc rằng bạn có thể tiết kiệm lớn hơn nhiều so với điều đó, với ít nỗ lực hơn.

Mặt khác, trong các sản phẩm thương mại trong những năm qua, "tối ưu hóa" đối với tôi chủ yếu bao gồm việc tìm kiếm mã gây lãng phí thời gian và không lãng phí nó. Không bi quan hơn tối ưu hóa.

(Mặt khác, một số người dính vào não rằng tối ưu hóa sớm là xấu, vì vậy nếu có một cách A để làm gì đó và cách B kém hiệu quả, họ sẽ chọn B vì A là "tối ưu hóa sớm" . Một số người chỉ là ngu ngốc).

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.