2016-05-09 14 views
6

Tôi đã xem xét việc tăng tốc ứng dụng của mình vì nó là hiệu suất quan trọng ... tức là mỗi mili giây tôi có thể thoát ra khỏi nó là tốt hơn. Để thực hiện điều này, tôi có một phương thức gọi một số phương thức khác và mỗi phương thức khác được bao gồm với bộ hẹn giờ Stopwatch và các cuộc gọi Console.WriteLine. Tức là .:Console.WriteLine tăng tốc mã của tôi?

private void SomeMainMethod() 
{ 
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
    sw.Start(); 
    SomeMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

    sw.Reset(); 
    sw.Start(); 
    SomeOtherMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

    //... 
} 

Vấn đề là bất cứ khi nào tôi nhận xét ra StopwatchConsole.WriteLine dòng mã chạy khoảng 20ms (không 50) chậm hơn đó là rất nhiều cho những gì tôi cần.

Có ai biết tại sao điều này không?

EDIT: Phương pháp SomeMainMethod và những người khác trong lớp cũng được bọc trong một StopwatchConsole.WriteLine cuộc gọi tương tự như trên.

SomeMainMethod và các phương thức mà nó gọi là một phần của lớp là một phần của Thư viện lớp được gọi từ bảng điều khiển bảng điều khiển, tất cả đều là chuỗi đơn.

Để biết thêm thông tin: Ứng dụng đang chạy ở chế độ Phát hành .NET 4.6.1 với chế độ tối ưu được bật. Tôi cũng đang chạy nó trong studio trực quan 2013 không phải bên ngoài nó.

+1

Điều đó có âm thanh kỳ quặc lạ .. Tôi không thể nói rằng Ive nhận thấy những thay đổi về tốc độ như vậy – BugFinder

+1

Nếu bạn không sử dụng Đồng hồ bấm giờ, bạn sẽ không đo thời gian trong cùng một cách_. Bạn đã tính toán điều đó chưa? – stuartd

+1

@stuartd nhưng hes nói rằng bằng cách tháo đồng hồ bấm giờ và hiển thị * chậm hơn *, không nhanh hơn? do đó có ít mã – BugFinder

Trả lời

2

Sau khi đọc rất giống question không có câu trả lời, tôi có thể đã tìm thấy sự cố. Trong phần ý kiến ​​người dùng (ForguesR) đưa ra nhận xét sau:

Nó thực sự là một dự đoán lớn: có thể do bạn đang viết cho IO thread của bạn được nhiều thời gian xử lý hơn vì WriteLine được đồng bộ và do đó chặn các chủ đề khác.

Vì vậy, tôi muốn kiểm tra nếu điều này là thực sự là trường hợp vì vậy tôi đã thay đổi SomeMainMethod thích như sau:

LƯU Ý: Nó thường không được khuyên nên chơi xung quanh với các ưu tiên chủ đề, điều này chỉ một là workaround để kiểm tra lý thuyết. Tôi sẽ khuyên bạn không nên làm điều này trong mã sản xuất trừ khi bạn chắc chắn 100% bạn biết mình đang làm gì. Sau đó có lẽ vẫn ở xa nó.

private void SomeMainMethod() 
{ 
    System.Threading.ThreadPriority tp = System.Threading.ThreadPriority.Normal; 
    try 
    { 
     tp = System.Threading.Thread.CurrentThread.Priority; 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     sw.Start(); 
     SomeMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

     sw.Reset(); 
     sw.Start(); 
     SomeOtherMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

     //... 
    } 
    finally 
    { 
     System.Threading.Thread.CurrentThread.Priority = tp; 
    } 
} 

Sau khi thực hiện này thay đổi mã của tôi bây giờ chạy liên tục nhanh hơn (~ 10ms) khi ConsoleStopwatch đường được nhận xét ra. Vì vậy, tôi tin rằng bình luận của ông có lẽ đúng, ít nhất là trong tình huống của tôi.

+0

Không quan tâm, điều gì sẽ xảy ra nếu bạn thực hiện SomeMethod một trăm lần. Tôi đoán là CPU throtling là infact thủ phạm (dường như chữa khỏi bằng Console.Write). Bạn đang ở chế độ Hiệu suất cao? Chế độ cân bằng sẽ mất một giây để 'quay lên' - và nó cũng sẽ nhút nhát tốc độ tuabin đầy đủ. Và bạn nói 10ms là một khoảng thời gian đáng kể cho bạn, nhưng 10ms dễ dàng được giới thiệu nếu mã được chạy trên một máy tính chậm hơn. – Patrick

+0

@Patrick Máy tính của tôi rất tệ nên mã không bao giờ nên chạy trên bất cứ thứ gì tệ hơn. Và tôi đã chạy mã rất nhiều lần mà không cần khởi động lại – TheLethalCoder

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