2011-10-16 58 views
6

Lời trên đường phố là cho các vòng lặp trong scala chậm hơn so với các vòng lặp.Tạo scala cho vòng lặp bằng cách sử dụng hprof

chậm:

for (i <- 0 until 10000) { 
    f(i) 
} 

Nhanh:

var i = 0 
while (i < 10000) { 
    f(i) 
    i += 1 
} 

Làm thế nào để sử dụng hprof để nói cho dù cho vòng là nút cổ chai trong mã của tôi? Tôi đang lược tả mã của mình bằng cách sử dụng -agentlib:hprof=cpu=samples, phương thức nào sẽ nằm trong phần "CPU SAMPLES"?

Tôi muốn biết nơi cần tập trung nỗ lực tối ưu hóa của mình. Là cho các vòng nút cổ chai?

Trả lời

3

Tôi nghĩ bạn có thể có nhiều may mắn hơn với các công cụ chuyên dùng với hồ sơ như yourkit hoặc visualvm.

Họ thường có giao diện để nắm bắt mẫu CPU và sau đó đi sâu để xem những cuộc gọi nào đã tiêu thụ hầu hết các chu kỳ CPU.

Cổ chai thuộc loại nào sẽ hiển thị (như lấy 95% thời gian CPU) và sau đó bạn có thể xem chi tiết cho đến khi bạn thấy phương thức nào của bạn (hoặc thư viện) nằm trên ngăn xếp cuộc gọi cho những điểm nóng đó. Sau đó, bạn có thể xem liệu các vòng lặp có liên quan hay không.

2

Đặt mỗi vòng lặp theo phương pháp riêng của nó, sau đó so sánh thời gian được thực hiện bởi các phương pháp. Và sử dụng lặp lại đủ để thực sự mất một thời gian (hoặc quấn những người trong vòng lặp khác). 10000 lần lặp nên mất micro giây; đó là khó khăn cho một profiler để đo lường. Hãy thử một tỷ (hoặc 100k iteratons của 10k lặp).

Ngoài ra, nếu f(i) là tốn kém, sẽ mất nhiều thời gian hơn vòng lặp sẽ. Ngoài ra, nếu f(i) không thực sự làm bất cứ điều gì, nó có thể được tối ưu hóa hoàn toàn. Vì vậy, hãy đảm bảo nó (ví dụ: cập nhật bộ đếm ở đâu đó, tính tổng hoặc thứ gì đó).

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