Từ 1 tới 1 trên tổng số 1 kết quả

Đề tài: Cách tăng hiệu suất chương trình C#

  1. #1
    Ngày gia nhập
    08 2011
    Nơi ở
    Yên Bái- Hà Nội
    Bài viết
    961

    Mặc định Cách tăng hiệu suất chương trình C#

    Chào cả nhà.
    Hiện tại mình nhận thấy chương trình của mình chạy không được nhanh như các phần mềm chuyên nghiệp. Vì thế mình thắc mắc các cách hay các thủ thuật để nâng cao hiệu suất chương trình. Rất mong nhận được sự góp ý, chia sẻ kinh nghiệm của các bạn.

    Ví dụ: có bạn ở đây chia sẻ thế này:
    1. So sánh chuỗi:

    Ở đây tôi dùng hai phương pháp so sánh chuỗi thường sử dụng (có phân biệt hoa thường). Điểm khác biệt giữa hai phương thức này là phương thức thứ 1 là tĩnh (static) nên ta có thể gọi trực tiếp từ lớp String.

    - (1) int String.Compare(string strA, string strB, bool ignoreCase)

    - (2) bool string.Equals(string value, StringComparison comparisonType)

    string s1=”aaa”;

    string s2=”AAA”;

    Đoạn mã 1:

    Code: (Click Here to Select All)

    for (int i = 0; i < 100000; i++) {

    bool b = String.Compare(s1, s2,true)==0;

    }

    Đoạn mã 2:

    Code: (Click Here to Select All)

    bool b = s1.Equals(s2,StringComparison.OrdinalIgnoreCase); } for (int i = 0; i < 100000; i++) {

    Đoạn mã thứ nhất chạy chậm hơn đoạn thứ hai hơn 3 lần. Tuy nhiên nếu bạn sử dụng tham số StringComparison.CurrentCultureIgnoreCase cho phương thức Equals thì tốc độ giữa hai đoạn mã là xấp xỉ. Một số người dùng cách chuyển cả hai chuỗi về dạng chữ hoa hoặc chữ thường rồi so sánh sẽ tốn thời gian lâu nhất (hơn 2 lần so với cách một).

    2. Xây dựng chuỗi – String và StringBuilder:

    Đây có lẽ là điều bạn thường gặp và cũng đã nắm bắt được sự khác biệt rõ ràng giữa chúng. Với số lần lặp tương đối lớn bạn sẽ có một khoảng thời gian chờ tương đối lâu khi làm việc với lớp String, vì thế tôi sẽ giảm số lần lặp xuống trong ví dụ này.

    Đoạn mã 1:

    Code: (Click Here to Select All)

    string str=”"; for (int i = 0; i < 10000; i++) {

    str += “a”;

    }

    Đoạn mã 2:

    Code: (Click Here to Select All)

    StringBuilder str=new StringBuilder(); for (int i = 0; i < 10000; i++) {

    str.Append(“a”);

    }

    Kết quả cho ta thấy đoạn mã một chạy chậm hơn khoảng từ 200 đến 300 lần đoạn mã hai. Nguyên nhân là toán tử + của lớp string sẽ tạo ra một đối tượng string mới trong mỗi lần lặp, trong khi phương thức Append của StringBuilder sẽ nối trực tiếp vào chuỗi hiện tại.

    Tuy nhiên cũng cần chú ý điều này có thể ngược lại nếu như bạn cần chuyển chuỗi StringBuilder thành String trong mỗi lần lặp. Tốc độ thực thi của đoạn mã thứ hai sẽ lâu hơn so với đoạn mã một. Hãy kiểm chứng bằng cách chạy thử đoạn mã hai sau khi sửa lại như sau:

    Đoạn mã 2 (đã sửa):
    Code: (Click Here to Select All)

    StringBuilder str = new StringBuilder(); string strRet; for (int i = 0; i < 10000; i++) {

    str.Append(“a”); strRet = str.ToString();

    }

    3. Nối chuỗi – Phương thức Insert() và toán tử +:

    Bạn thường sử dụng hai cách để nối hai chuỗi lại với nhau là dùng toán tử + và phương thức Insert() của đối tượng string. Cách đầu tiên được sử dụng nhiều hơn vì cách viết tiện lợi và dễ hiểu hơn, tuy nhiên bạn chỉ có thể nối vào đầu hoặc cuối chuỗi. Hãy thử so sánh xem phương pháp nào cho tốc độ thực thi nhanh hơn, giả sử bạn cần nối một chuỗi con vào đầu một chuỗi.

    Đoạn mã 1:

    Code: (Click Here to Select All)

    string str=”"; for (int i = 0; i < 10000; i++) {

    str = “string”; str= str.Insert(0, “my “);

    }

    Đoạn mã 2:
    Code: (Click Here to Select All)

    string str=”"; for (int i = 0; i < 10000; i++) {

    str = “string”; str = “my ” + str;

    }

    Nếu chạy thử vài lần, bạn sẽ nhận thấy rằng đoạn mã thứ hai chạy nhanh gấp đôi đoạn mã một. Tuy nhiên nếu như không khởi tạo lại giá trị của biến str trong mỗi lần lặp, tốc độ của hai đoạn mã này là xấp xỉ nhau.

    4. Cắt chuỗi – Substring() và Remove():

    Hai phương thức trên của lớp string có chức năng khá giống nhau là cắt bỏ một phần chuỗi nguồn. Cả hai phương thức đều có 2 kiểu nạp chồng, và đều yêu cầu truyền vào vị trí bắt đầu của chuỗi. Tùy vào trường hợp, Substring() thích hợp cho việc cắt bỏ chuỗi phía trước, còn Remove() lại thường dùng để cắt bỏ phía sau chuỗi. Trong ví dụ này tôi sẽ dùng hai phương thức này để cắt bỏ 1 kí tự phía trước chuỗi:
    Đoạn mã 1:

    Code: (Click Here to Select All)

    string str; for (int i = 0; i < 10000; i++) {

    str = “string”; str = str.Remove(0, 1);

    }

    Đoạn mã 2:
    Code: (Click Here to Select All)

    string str; for (int i = 0; i < 10000; i++) {

    str = “string”; str = str.Substring(1);

    }

    Sự khác biệt giữa đoạn mã hai so với đoạn mã một là tốc độ nhanh hơn khoảng 2 lần. Tuy nhiên sự khác biệt này sẽ trở nên khó phân biệt nếu như bạn dùng chúng để cắt ở vị trí khác, như là cuối chuỗi chẳng hạn.

    (trích:http://khoinguonit.com/f81/tang-hieu...g-trinh-c-261/)
    Đã được chỉnh sửa lần cuối bởi mrfour.it : 05-04-2012 lúc 09:39 PM.
    Skype: mrfour.it - Yahoo:mrfour_it
    Gmail: mrfour.it@gmail.com
    Bạn muốn học lập trình? Bạn chưa có kiến thức cơ bản? Bạn muốn học từ cơ bản tới nâng cao?... Bạn muốn có source code để tham khảo? Muốn có người hỗ trợ khi học?....http://www.laptrinh123.com sẽ giúp bạn những điều đó!

Các đề tài tương tự

  1. Tăng hiệu suất chương trình C#
    Gửi bởi Yin Yang trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 12
    Bài viết cuối: 01-09-2010, 10:00 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn