2010-03-28 57 views
5

Greets-Java giảm sử dụng CPU

Chúng tôi gots một vài nutters trong công việc người thích sử dụng

while(true) { //Code } 

trong mã của họ. Như bạn có thể tưởng tượng điều này maxes ra CPU. Có ai biết cách để giảm sử dụng CPU để những người khác có thể sử dụng máy chủ là tốt.

Mã tự nó chỉ liên tục bỏ phiếu internet để cập nhật trên các trang web. Vì vậy, tôi sẽ tưởng tượng một phương pháp ngủ ít sẽ làm giảm đáng kể việc sử dụng CPU.

Ngoài ra tất cả các thao tác đang được thực hiện trong các đối tượng String (Java) bất cứ ai biết có bao nhiêu StringBuilders sẽ làm giảm đầu hơn?

Thanks cho bất kỳ con trỏ

+4

'while (true)' chỉ đơn giản là một thành ngữ có nội dung "làm điều này mãi mãi". Tự nó không làm gì cả; mã bên trong nó là những gì tiêu thụ chu kỳ CPU. Nếu mã bên trong đang tạo ra các yêu cầu mạng, thì nó sẽ bỏ thời gian của nó khi làm như vậy, vì vậy những người dùng khác sẽ nhận được các yêu cầu của họ; một 'sleep()' sẽ không ảnh hưởng đáng kể đến thông lượng tổng thể của máy chủ (mặc dù nó sẽ là một điều tốt đẹp cho những máy chủ đang bị chương trình tấn công). Và cuối cùng, 'StringBuilder' có thể hoặc (nhiều khả năng) có thể không cải thiện hiệu suất. Nhưng đó là lý do tại sao hồ sơ tồn tại: họ có thể cho bạn biết những gì đang dành nhiều thời gian nhất trong chương trình. – kdgregory

+3

Như mọi khi chạy một profiler để xác định nơi cpu đi. Sau đó, sử dụng dữ liệu đó để đánh bại nhà phát triển có trách nhiệm trên đầu. –

+0

Hệ điều hành nào? –

Trả lời

6

Tôi sẽ bắt đầu với câu hỏi thứ hai của bạn, tôi muốn đồng ý với phần còn lại mà StringBuilder vs String là rất nhiều phụ thuộc vào chuỗi các thao tác cụ thể. Tôi đã "chuẩn" này một lần và nói chung là số lượng phân bổ chuỗi mới đi lên (thường là ở dạng nối) thời gian thực hiện tổng thể tăng lên. Tôi sẽ không đi vào chi tiết và chỉ nói rằng StringBuilder hóa ra là hiệu quả nhất làm thêm giờ, khi so sánh với String, StringBuffer, String.format(), MessageFormat ...

Quy tắc của tôi là bất cứ khi nào tôi muốn nối nhiều hơn 3 chuỗi với nhau, tôi luôn sử dụng StringBuilder.

Đối với câu hỏi đầu tiên của bạn. Chúng tôi đã có yêu cầu để sử dụng CPU đến 5%. Không phải là một nhiệm vụ dễ dàng. Chúng tôi đã sử dụng cơ chế AOP của Spring để thêm Thread.sleep() vào trước khi thực hiện bất kỳ phương thức nào của phương pháp chuyên sâu CPU. Thread.sleep() sẽ chỉ được gọi nếu một số giới hạn đã bị vượt quá. Tôi xin lỗi khi nói rằng việc tính toán giới hạn này không đơn giản như vậy. Và thậm chí sorrier để nói rằng tôi vẫn chưa có được sự cho phép để đăng nó lên trên mạng. Vì vậy, đây chỉ là để đưa bạn vào một ca khúc thú vị nhưng phức tạp đã được chứng minh để làm việc theo thời gian.

+2

Lý do nào có thể dẫn đến yêu cầu "không quá 5% thời gian CPU"? Nếu bạn có một nhiệm vụ đòi hỏi nhiều CPU, thì bạn có một nhiệm vụ chuyên sâu về CPU. Không có cách nào xung quanh điều đó và việc thêm ngủ vào mã của bạn chỉ đơn giản là làm cho tác vụ đó mất nhiều thời gian hơn. Nếu bạn lo ngại về tác động của một chương trình cụ thể đối với các tài nguyên hệ thống tổng thể, thì việc thông minh của chương trình đó trở nên thông minh hơn rất nhiều. Hoặc mua một máy tính khác. – kdgregory

+1

Cá nhân, tôi không thể đồng ý với bạn nhiều hơn nữa! Tuy nhiên, tôi chỉ là một lập trình viên và không "kỹ sư" giải pháp này. Điểm duy nhất của tôi là loại điều này có thể được thực hiện, nếu cần thiết :) – Yaneeve

+0

@Yaneeve .. Quá muộn để hỏi điều này. Làm cách nào bạn quản lý sự cân bằng giữa tốc độ và mức sử dụng CPU? Tôi chắc chắn, giấc ngủ có tác động hiệu quả vì nó tăng thời gian thực hiện. – bluelurker

2

Làm cho nó chờ đợi một thời gian trước khi bắn một lần nữa, như thế này:

while(true) { 
    //Code 
    Thread.sleep (1000); //Wait 1 second 
} 

Đối với câu hỏi thứ hai, nó sẽ làm giảm trí nhớ và khả năng sử dụng CPU là tốt, nhưng lợi ích thực sự phụ thuộc vào những gì đang xảy ra với những chuỗi đó.

4

Tần suất các trang web đó cập nhật? Bạn có thể thực sự gây phiền nhiễu cho chủ nhà. Chỉ cần dán Thread.sleep(60 * 1000); vào cuối vòng lặp và bạn có thể tránh điều này. Điều đó sẽ thăm dò ý kiến ​​họ một lần một phút - chắc chắn là đủ?

2

Chế độ ngủ sẽ giảm mức sử dụng CPU. Đối với StringBuilders, chúng có thể làm giảm mức sử dụng bộ nhớ và cải thiện hiệu năng.

0

Bạn cũng có thể thử

Thread.yield() 
+3

@Helper Method - "Yield" chỉ khiến đối tượng chuỗi đang thực hiện tạm thời tạm dừng và cho phép các luồng khác thực hiện ... vì vậy điều này sẽ chỉ làm giảm đáng kể mức sử dụng CPU nếu có bất kỳ ứng dụng người dùng nào khác chạy song song. "Ngủ" sẽ phù hợp hơn với những gì anh ấy muốn đạt được. – XpiritO

+0

@XpritO Sry, bạn nói đúng. Không hoàn toàn có được điểm của OP.Có lẽ tôi không nên đọc bài trước cà phê thứ 2 của tôi ^^. – helpermethod

+0

đó là lý do trong 5% tải CPU, để cung cấp cho các ứng dụng khác không gian để 'thở' trên cùng một máy tính và có thể đạt được bằng cách đặt một số Thread.yield() ở những nơi quan trọng của mã. Tôi đang làm điều đó và nó rất hữu ích từ điểm kinh nghiệm sử dụng phần mềm thông thường .. –

7

Rất nhiều "trí tuệ dân gian" về StringBuilder không chính xác.Ví dụ, thay đổi này:

String s = s1 + ":" + s2 + ":" + s3; 

này:

StringBuilder sb = new StringBuilder(s1); 
sb.append(":"); 
sb.append(s2); 
sb.append(":"); 
sb.append(s3); 
String s = sb.toString(); 

có lẽ sẽ không làm cho nó đi nhanh hơn. Điều này là do trình biên dịch Java thực sự dịch chuỗi ghép nối thành một chuỗi tương đương gắn thêm vào một StringBuilder tạm thời. Trừ khi bạn đang ghép nối các chuỗi trong một vòng lặp, bạn nên sử dụng toán tử +. Mã của bạn sẽ dễ đọc hơn.

Điểm khác cần được thực hiện là bạn nên sử dụng trình lược tả để xác định các địa điểm trong mã của bạn sẽ được hưởng lợi từ công việc để cải thiện hiệu suất. Hầu hết các nhà phát triển trực giác về những gì đáng được tối ưu hóa không phải là đáng tin cậy.

0

Nếu mã của họ là trong một JVM riêng biệt và đang chạy trên Linux hoặc một số Unix khác, đòi hỏi họ phải chạy chương trình của họ tại đẹp 20.

Hoặc bạn có thể có họ chạy bên trong một máy ảo như VirtualBox và sử dụng nó để hạn chế việc sử dụng bộ vi xử lý.

Hoặc bạn có thể kích hoạt chúng nếu chúng tiếp tục ghi chu kỳ như vậy thay vì sử dụng một số mô hình theo hướng sự kiện hoặc Thread.sleep.

0
  1. gì các trang web là mã bỏ phiếu? Do chúng có hỗ trợ tính năng đẩy RSS không?
  2. Nếu có, thì không cần phải thăm dò ý kiến ​​các trang web và thay vào đó hãy cắm mô-đun để chờ cập nhật. Phương pháp hiện tại sau đó chờ sử dụng wait();
  3. Mô đun mới sau đó thông báo cho đối tượng bằng phương pháp này sử dụng notifyAll().
  4. Phải thừa nhận rằng đây là một số công việc phụ, nhưng nó tiết kiệm được rất nhiều băng thông và tính toán.