2008-10-08 22 views
18

Đây thực sự là hai câu hỏi, nhưng họ là như vậy tương tự, và để giữ cho nó đơn giản, tôi figured tôi chỉ muốn cuộn chúng lại với nhau:Đẩy Up C#

  • Thứ nhất: Cho một # dự án thành lập C thế nào là một số cách phong nha để tăng tốc độ nó vượt ra ngoài chỉ là đồng bằng trong mã tối ưu hóa?

  • Thứ hai: Khi viết chương trình từ đầu trong C#, một số cách hay để cải thiện hiệu suất là gì?

Hãy tránh xa các kỹ thuật tối ưu hóa chung trừ khi họ là C# cụ thể.

Điều này trước đây đã được yêu cầu Python, PerlJava.

+0

Tôi xin lỗi, nhưng các kỹ thuật tối ưu hóa chung là theo định nghĩa chung, chúng không thể là C# cụ thể :-). –

Trả lời

0

NGEN sẽ trợ giúp với một số mã, nhưng không ngân hàng trên đó.

Cá nhân, nếu thiết kế của bạn xấu/chậm, bạn không thể làm gì nhiều.

Đề xuất tốt nhất trong trường hợp này, là triển khai một số hình thức lưu bộ nhớ đệm của các tác vụ tốn kém.

+0

ngen có thể làm cho chương trình .NET khởi động nhanh hơn, nhưng nó có thể làm tổn thương hiệu năng sau khởi động (nó không tối ưu hóa khá tích cực). –

+0

Do đó tại sao tôi nói không để ngân hàng trên đó. :) – leppie

+0

Nhưng điểm quan trọng là nếu bạn đang nói về hiệu suất không khởi động, ngen sẽ không giúp gì cả. –

2

Rất nhiều sự chậm trễ liên quan đến truy cập cơ sở dữ liệu. Làm cho truy vấn cơ sở dữ liệu của bạn hiệu quả và bạn sẽ làm được rất nhiều cho ứng dụng của mình.

18

Off đỉnh đầu của tôi:

  • Thay thế các biến thể phi chung của lớp container bởi các đối tác chung của họ
  • Cắt xuống trên boxing/unboxing. Cụ thể, sử dụng generics nếu có thể và thường tránh các loại giá trị chuyển đổi là object.
  • Đối với các hộp thoại sử dụng nhiều điều khiển động: hãy tạm dừng vẽ cho đến khi sau khi chèn tất cả các điều khiển bằng cách sử dụng SuspendLayout/ResumeLayout. Điều này giúp đặc biệt khi sử dụng các thùng chứa bố cục.
9

Một điều đơn giản là đảm bảo rằng cấu hình xây dựng của bạn được đặt thành "Bản phát hành". Điều này sẽ cho phép tối ưu hóa và loại bỏ thông tin gỡ lỗi, làm cho tệp thực thi của bạn nhỏ hơn.

Thông tin thêm on MSDN nếu cần.

0

Không sử dụng để phản ánh nhiều.

12

Thật không may, tương đối ít tối ưu hóa là ngôn ngữ cụ thể.Những điều cơ bản áp dụng trên ngôn ngữ: hiệu suất

  • Đo chống lại quá thực tế
  • có mục tiêu xác định rõ ràng để hướng dẫn bạn
  • Sử dụng một hồ sơ tốt
  • Optimize kiến ​​trúc/thiết kế tương đối sớm
  • Chỉ vi tối ưu hóa khi bạn gặp sự cố đã được chứng minh

Khi bạn hoàn toàn chứng minh bạn cần tối ưu hóa vi mô, chuyên nghiệp filer có xu hướng làm cho nó rõ ràng những gì để tìm kiếm - những thứ như tránh boxing và các cuộc gọi ảo.

Ồ, một điều tôi có thể nghĩ là .NET cụ thể: nếu bạn cần thực hiện cuộc gọi thường xuyên và hiện đang sử dụng phản chiếu, convert those calls into delegates.

EDIT: Các câu trả lời khác gợi ý sử dụng Generics và StringBuilder vv tất nhiên là đúng. Tôi (có thể sai) cho rằng những optimisations quá "rõ ràng";)

+0

@ chỉnh sửa của bạn: Tôi nghĩ tốt là không lặp lại quá nhiều lời khuyên. Câu trả lời thực sự cho một câu hỏi thường là tập hợp tất cả các câu trả lời được kết hợp. –

3
  • Sử dụng StringBuilder hơn rất nhiều nối chuỗi. Đối tượng chuỗi là nguyên tử và bất kỳ sửa đổi nào (bổ sung, to-upper, padding, v.v.) thực sự tạo đối tượng chuỗi hoàn toàn mới thay vì sửa đổi bản gốc. Mỗi chuỗi mới phải được phân bổ và cuối cùng là rác được thu thập.

  • Tổng quát hóa câu lệnh trước: Cố gắng sử dụng lại các đối tượng thay vì tạo nhiều và nhiều đối tượng. Việc phân bổ và thu gom rác thải có thể dễ dàng thực hiện, nhưng chúng đạt hiệu suất của bạn.

  • Đảm bảo sử dụng thư viện Microsoft được cung cấp cho hầu hết mọi thứ. Các lớp do Framework cung cấp thường sử dụng các tính năng không khả dụng hoặc khó truy cập từ mã C# của riêng bạn (ví dụ: thực hiện cuộc gọi đến API Windows gốc). Các thư viện tích hợp không phải là luôn là hiệu quả nhất, nhưng thường xuyên hơn không.

  • Viết các ứng dụng không đồng bộ chưa bao giờ dễ dàng hơn thế. Nhìn vào những thứ như lớp BackgroundWorker.

  • Cố gắng không xác định Structs trừ khi bạn thực sự cần. Các biến cá thể lớp từng giữ một tham chiếu đến cá thể thực tế, trong khi các biến cá thể struct từng chứa một bản sao riêng biệt.

+2

Tôi nghĩ rằng bạn có nghĩa là bất biến thay vì nguyên tử khi mô tả chuỗi. –

+0

Ghép chuỗi thực sự nhanh nhất cho đến khoảng 7 chuỗi hoặc hơn. – endian

+1

Chuỗi cũng được xử lý hơi khác nhau theo thời gian chạy. Chúng được lưu trữ (Interned), để nếu hai cá thể chuỗi được khai báo có cùng giá trị, cá thể thứ hai sẽ sử dụng lại giá trị của giá trị đầu tiên. – StingyJack

0

Sử dụng ngen.exe (nên đến vận chuyển với Visual Studio.)

http://msdn.microsoft.com/en-us/library/6t9t5wcf(VS.80).aspx

Generator Native Image (ngen.exe) là một công cụ để cải thiện hiệu suất của các ứng dụng quản lý . Ngen.exe tạo hình ảnh gốc, là các tệp chứa mã máy của bộ xử lý được biên dịch cụ thể và cài đặt chúng vào bộ nhớ cache hình ảnh gốc trên máy tính cục bộ. Thời gian chạy có thể sử dụng hình ảnh gốc từ bộ nhớ cache thay vì sử dụng trình biên dịch vừa phải (JIT) để biên dịch bản gốc.

+1

Như đã đề cập ở những nơi khác, tuy nhiên, ngen chỉ tăng hiệu suất khởi động - nó không tạo ra mã được tối ưu hóa tốt hơn. (Khá ngược lại trong một số trường hợp, trên thực tế.) –

0

Ngoài các phương pháp mã hóa tốt nhất được liệt kê ở trên, bao gồm sử dụng StringBuilders khi thích hợp và các mục có tính chất đó.

Tôi khuyên bạn nên sử dụng công cụ lược tả mã như ANTS Profiler của RedGate. Tôi đã thấy rằng sau khi thực hiện các bước chuẩn để tối ưu hóa việc sử dụng Profiler tôi có thể tiếp tục tối ưu hóa mã của mình bằng cách nhanh chóng xác định (các) vùng mã bị ảnh hưởng nặng nề nhất bởi ứng dụng.

3

Sử dụng bố cục thay vì thừa kế, giới hạn quyền anh/unboxing, sử dụng bộ sưu tập chung, sử dụng vòng lặp foreach thay cho {} bằng bộ đếm và giải phóng tài nguyên bằng mẫu Vứt bỏ chuẩn.

Chúng được trình bày chi tiết trong cuốn sách tuyệt vời Hiệu quả C#.

+0

Mặc dù tôi thường sử dụng foreach thay vì cho, nhưng đối với dễ sử dụng, không hiệu suất. Bạn có biết tại sao chính xác là chậm hơn sau đó foreach? –

+0

Vì tôi đã đăng câu trả lời này một vài tháng trước đây, có một câu hỏi được đặt ra về foreach và for. Tôi sẽ xem nếu tôi có thể tìm thấy nó. –

+0

Hoặc thậm chí tốt hơn, hiệu quả hơn C# –

3

Cấu hình mã của bạn. Sau đó, bạn có thể ít nhất có một sự hiểu biết về nơi bạn có thể cải thiện. Nếu không có hồ sơ, bạn đang chụp trong bóng tối ...

9

Sử dụng một trình định dạng chất lượng tốt và xác định vị trí nút cổ chai của bạn.

Sau đó, bắt đầu hỏi cách cải thiện hiệu suất.

Bất kỳ ai thực hiện bất kỳ tuyên bố chăn nào như 'tránh phản chiếu' mà không hiểu cả hồ sơ hiệu suất và miền vấn đề của bạn sẽ bị bắn (hoặc ít nhất là được cải thiện). Và với kích thước của khung cảnh .Net, nó khá là vô nghĩa khi nói về tối ưu hóa C#: chúng ta đang nói về WinForms, ASP.Net, BizTalk, Workflow, SQL-CLR? Nếu không có bối cảnh, ngay cả hướng dẫn chung có thể là tốt nhất một sự lãng phí thời gian.

Cũng xem xét ý của bạn là 'tăng tốc' và 'cải thiện hiệu suất'. Bạn có nghĩa là hiệu quả tài nguyên lớn hơn, hoặc thời gian chờ đợi thấp hơn được nhận thức cho một người dùng cuối (giả sử có một)? Đây là những vấn đề rất khác nhau để giải quyết.

Với diễn đàn, tôi cảm thấy có nghĩa vụ chỉ ra rằng có một số phạm vi bảo hiểm khá tốt về các chủ đề này trong Hoàn thành mã. Không phải C# tâm cụ thể. Nhưng đó là một điều tốt. Ghi nhớ các tối ưu hóa vi-ngôn ngữ cụ thể có thể được đưa vào phiên bản tiếp theo của bất kỳ trình biên dịch nào bạn đang sử dụng, Và nếu sự khác biệt giữa for và foreach là một vấn đề lớn đối với bạn thì có lẽ bạn đang viết C++, đúng không?

[Tôi thích ANts Profiler RedGate, nhưng tôi nghĩ rằng nó có thể được bettered]

Với điều đó ra cách, một vài suy nghĩ:

  • Sử dụng loại (SomeType) trong ưu tiên cho instance.GetType() khi có thể
  • Sử dụng foreach trong ưu đãi để cho
  • Tránh đấm bốc
  • Lên đến (tôi nghĩ) 3 chuỗi nó là ok để làm StringA + StringB + StringC.Sau đó bạn nên sử dụng một StringBuilder
+0

Một số người sẽ cho bạn biết tối đa 5 chuỗi trước khi trình xây dựng chuỗi. Tốt bài viết một trong hai cách. – Echostorm

+0

+1. Hoàn toàn chính xác trong việc nhấn mạnh các khuyến nghị tối ưu hóa chăn vô nghĩa, và cách bạn TUYỆT ĐỐI PHẢI LÀ HỒ SƠ! –

+0

Cũng tốt đẹp để xem một chút khuyến nghị StringBuilder lành mạnh hơn. Thường xuyên hơn thì không phải trình xây dựng chuỗi được đề xuất sai cho mọi tình huống. –

0

Điều này đúng cho bất kỳ ngôn ngữ, không chỉ C#

  1. Đối với một ứng dụng hiện có, không làm bất cứ điều gì cho đến khi bạn biết điều gì làm cho nó chậm . IMHO, this is the best way.

  2. Đối với ứng dụng mới, vấn đề là cách lập trình viên được dạy. Họ được dạy để làm cho núi ra khỏi molehills. Sau khi bạn đã tối ưu hóa một vài ứng dụng bằng cách sử dụng this, bạn sẽ quen thuộc với vấn đề về cái mà tôi gọi là "tổng quát phi thường" - lớp trên lớp "trừu tượng", thay vì chỉ yêu cầu vấn đề yêu cầu. Điều tốt nhất bạn có thể hy vọng là chạy theo họ, nói cho họ biết vấn đề hiệu suất là gì mà họ vừa mới đưa vào, để họ có thể đưa họ ra ngoài khi họ đi cùng.

-1

Đối với các biểu mẫu Windows trên XP và Vista: Bật đệm đôi trên bảng. Nó không gây ra vấn đề minh bạch, vì vậy bạn chắc chắn sẽ muốn thử nghiệm giao diện người dùng:

protected override System.Windows.Forms.CreateParams CreateParams { 
    get { 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle = cp.ExStyle | 0x2000000; 
     return cp; 
    } 
} 
0

mục Caching là kết quả của một truy vấn:

private Item _myResult; 
public Item Result 
{ 
    get 
    { 
      if (_myResult == null) 
      { 
       _myResult = Database.DoQueryForResult(); 
      } 
      return _myResult; 
    } 
} 

của một kỹ thuật cơ bản mà thường bị bỏ qua bởi các lập trình viên bắt đầu, và một trong những cách dễ nhất để cải thiện hiệu suất trong một ứng dụng.

Câu trả lời được chuyển từ câu hỏi đã được phán quyết là bản dupe của câu hỏi này.