2009-02-26 37 views
5

Hôm nay tôi đã được giao nhiệm vụ cải thiện hiệu suất của một trang ASP cổ điển. Viết lại mã trong ASP.NET là tại thời điểm này không phải là một lựa chọn vì vậy tôi đã lên những thách thức để squeeze mỗi ounce hiệu suất tôi có thể nhận được ra khỏi trang.Mẹo về hiệu suất cho asp cổ điển?

Trang này bao gồm "CHỌN BLA TỪ BLA" cơ bản thành một vài bản ghi. Một vòng lặp while lặp lại thông qua các tập bản ghi và các biến đó <tr> <td> chuỗi. Trong vòng lặp while có một loạt các điều kiện và không có điều gì. Có 3 chương trình con được gọi là sử dụng các biến toàn cầu (không phải biến cục bộ được truyền dưới dạng tham số).

Vì vậy, không có gì thực sự gây sốc hoặc bất cứ điều gì. Trước khi tôi bắt đầu tối ưu hóa, vòng lặp mất khoảng 15 giây để hoàn tất. Trong số 15 giây xung quanh 6 đã được đưa lên bởi các truy vấn sql.

Sau khi thay đổi một vài thứ xung quanh, tôi đã xoay xở để đạt được khoảng 7 giây.

Những điều mà tôi đã thay đổi xung quanh là:

  • Thay vì làm SELECT *, tôi chỉ chọn các cột mà tôi cần. Truy vấn giảm xuống trung bình 4 giây. Đó là một truy vấn khá nặng với lượt xem trong chế độ xem.

  • Tôi đã xóa tất cả chuyển ngữ cảnh trong vòng lặp. Vì vậy, tôi đã thay đổi những thứ như <% = bla%> thành Response.Write (bla).

  • 3 chương trình con được định nghĩa là hàm, nhưng chúng được sử dụng làm phụ (không có kết quả). Vì vậy, tôi đã thay đổi các chức năng để subs. cái đó có giúp ích không?

Sau khi thực hiện thay đổi, tôi thấy rằng phần lớn thời gian đã được thực hiện bởi một trong các chương trình con. Tôi không có thời gian đủ ngày hôm nay để thay đổi chương trình con, nhưng nó bao gồm những thứ như:

  • ngày chức năng: DATEADD, DATEDIFF
  • mảng chức năng: UBound (arr) và chỉ số tham khảo: arr (I)
  • chức năng string: trái, giữa, phải, dưới, thay thế

Với mỗi cuộc gọi trang, chương trình con được chạy khoảng 1600 lần.

Bất kỳ ai có trải nghiệm nào với việc tối ưu hóa các trang asp cổ điển? Bạn có mẹo nào để tối ưu hóa không? Những gì tôi đang tìm kiếm là cải thiện mã bên trong một câu lệnh vòng lặp do ...

Tôi là một nhà phát triển ASP.NET có kinh nghiệm và biết khá nhiều về cải thiện hiệu suất trong ASP.NET. ASP cổ điển sử dụng một "động cơ" khác nhau vì vậy tôi đã tự hỏi nếu có ai ra có bất kỳ cái nhìn sâu sắc vào việc cải thiện hiệu suất của ASP cổ điển.

Cảm ơn!

M

PS: Vâng, tôi biết rằng classic ASP sử dụng VBScript

Trả lời

3

Với mỗi cuộc gọi trang, chương trình con được chạy khoảng 1600 lần.

tôi muốn nói đó là khá nhiều toàn bộ vấn đề, nhưng mà không biết các chi tiết của dữ liệu trả về truy vấn, những gì chương trình con mà không, và tại sao nó cần phải được thực hiện 1600 lần cho một trang, đó là khó đề xuất nhiều để giảm nó.

+0

Nó dành cho một ứng dụng lập kế hoạch và người xây dựng nó tạo ra một vòng lặp lớn trong suốt cho thấy việc lập kế hoạch nhiều bản ghi cho cả tháng (30 cột và khoảng 20 hàng). – mghaoui

0

Nếu bạn thực sự nghĩ rằng vấn đề nằm trong 1 hàm đó, tại sao bạn không đặt mã ở đây để mọi người có thể đưa ra đề xuất tối ưu hóa.

+0

Rất tiếc, tôi không sở hữu mã. Tôi có thể sẽ gặp rắc rối khi đăng nó. Hàm cơ bản xây dựng các chuỗi dựa trên recordset nhưng nối và conctenating và sau đó bán nó với response.write. Công cụ chuẩn. – mghaoui

+0

Thật không may, thật khó để đưa ra gợi ý khi bạn đang làm công cụ chuẩn và chúng tôi không có quyền truy cập vào mã. :) Giống như Chad đã nói, có thể bạn có thể suy nghĩ thêm về "lý do". Hoặc có thể bạn có thể thử di chuyển một loạt các hoạt động đến một thủ tục được lưu trữ. –

+0

Tôi tự hỏi liệu đó có phải là sự ghép nối gây ra vấn đề không. VB được biết đến với việc không xử lý concat 'của chuỗi tốt ... Nhìn vào một phương pháp thay thế bằng văn bản cho màn hình hoặc tạo chuỗi dài (nghĩ mảng hoặc đối tượng dòng). –

-2

tôi có kinh nghiệm rằng trong hầu hết các trường hợp, bạn có thể đạt được hiệu suất khi sử dụng một StringBuilder trong ASP cổ điển. Có StringBuilder implementation cho ASP cổ điển trong số ajaxed library. Nó sử dụng .net StringBuilder. Điều đó khá thú vị và dễ sử dụng:

<% 
set output = new StringBuilder 
do 
    output("some output") 
loop 
response.write(output.toString()) 
%> 

Tôi khuyên bạn nên sử dụng thư viện ajaxed nếu bạn cần thực hiện một số chỉnh sửa. Nó được thiết lập một cách nhanh chóng và cung cấp cho bạn rất nhiều công cụ cho ASP cổ điển. Ví dụ. Có lẽ bạn cũng có thể đạt được một số hiệu suất khi sử dụng AJAX (hoặc ít nhất là ấn tượng về hiệu suất).

3

Tôi đang đánh dấu câu trả lời của MrChrister là câu trả lời cho câu hỏi của tôi "Bạn có mẹo nào để tối ưu hóa không?". Những lời khuyên có tốt và nó quản lý để tăng tốc độ kịch bản bằng 2 giây.

Tôi phát hiện ra cuối cùng điều gì đã khiến kịch bản chậm. Trong vòng lặp while lập trình viên đã làm Filter (Array) rất nhiều. Về cơ bản, ông đã sử dụng Filter (Array) để tra cứu các cặp khóa/giá trị.

Vì vậy, giải pháp cuối cùng đã thay đổi mã của Bộ lọc (Mảng) để sử dụng đối tượng "Scripting.Dictionary". Nó đẩy mã lên theo hệ số 12.

Cảm ơn tất cả các thư trả lời của bạn.

M

3

Thấy rằng đây là câu hỏi phổ biến tôi đã quyết định giải thích những gì tôi đã làm cách đây 3 năm để tăng tốc tập lệnh ASP.

Tập lệnh gốc sử dụng nhiều mảng có thể thay đổi kích thước để lưu trữ khóa-giá trị, vì vậy tôi đã sửa đổi mã đó để sử dụng Scriting.Dictionary. Ví dụ:

Dim myDictionary 
Set myDictionary = Createobject("Scripting.Dictionary") 
myDictionary.item("key") = "value" 

Đó là mảng nhanh hơn nhiều lần có thể thay đổi kích thước.

Một thay đổi lớn khác là nối chuỗi. Các kịch bản ban đầu là đầy đủ của:

S = "" 
S = S & "First line<br />" 
S = S & "Second line<br />" 
S = S & "Third line line<br />" 
Response.Write(S) 

tôi sửa đổi này để:

Response.Write("First line<br />") 
Response.Write("Second line<br />") 
Response.Write("Third line<br />") 

Điều này làm nên sự khác biệt rất lớn. Việc nối chuỗi là một nút cổ chai lớn bởi vì chuỗi được vứt bỏ và sau đó được khởi tạo lại.

lựa chọn khác là:

S = "First line<br />" & _ 
     "Second line<br />" & _ 
     "Third line line<br />" 
Response.Write(S) 

Đây cũng là một mẹo tốt cho ASP.NET: Sử dụng một StringBuilder thay vì concatenating dây.

Một thay đổi quan trọng khác là chuyển đổi ngữ cảnh. Mã ban đầu là đầy đủ của:

<table> 
    <tr> 
     <td><%= rs("Col1") %></td> 
     <td><%= rs("Col2") %></td> 
     <td><%= rs("Col2") %></td> 
    </tr> 
</table> 

3 bối cảnh chuyển mạch mất rất nhiều thời gian vì vậy tôi sửa đổi như sau:

<% 
Response.Write("<table>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col1")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col2")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("<tr>") 
Response.Write("<td>") 
Response.Write(rs("Col3")) 
Response.Write("</td>") 
Response.Write("</tr>") 
Response.Write("</table>") 
%> 

Có mã là rất cần thiết nhưng nó thực hiện tốt hơn.

Một thay đổi nhỏ (mà thực sự là một bẩn hack) là sử dụng VỚI (NOLOCK) trong các truy vấn SQL của bạn:

conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id") 

Nó làm cho một sự khác biệt.

Cuối cùng, tôi không biết điều đó có hữu ích hay không, nhưng có rất nhiều mã được sao chép mà tôi đã tái cấu trúc thành các hàm sạch.

Tôi hy vọng rằng mọi người tìm thấy thông tin này sẽ thấy những mẹo này hữu ích.

+0

Nhận xét của tôi bị giảm giá xuống 0? Có thật không? Người đã downvoted thực sự đọc chủ đề chưa? – mghaoui

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