日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微软建议的ASP性能优化28条守则

發(fā)布時間:2023/12/9 编程问答 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微软建议的ASP性能优化28条守则 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二十八條改善 ASP 性能和外觀的技巧
Len Cardinal,高級顧問,Microsoft Consulting Services George V. Reilly
Microsoft IIS Performance Lead

改編自Nancy Cluts 的文章 開發(fā)人員技術(shù)工程師
Microsoft Corporation
2000 年 4 月

摘要:本文介紹優(yōu)化 ASP 應用程序和 VBScript 的技巧。

目錄
技巧 1:將經(jīng)常使用的數(shù)據(jù)緩存在 Web 服務器上
技巧 2:將經(jīng)常使用的數(shù)據(jù)緩存在 Application 或 Session 對象中
技巧 3:將數(shù)據(jù)和 HTML 緩存在 Web 服務器的磁盤上
技巧 4:避免將非敏捷的組件緩存在 Application 或 Session 對象中
技巧 5:不要將數(shù)據(jù)庫連接緩存在 Application 或 Session 對象中
技巧 6:合理地使用 Session 對象
技巧 7:將代碼封裝在 COM 對象中
技巧 8:遲一點獲得資源,早一點釋放資源
技巧 9:進程外執(zhí)行過程以性能換取可靠性
技巧 10:使用顯式選項
技巧 11:在子例程和函數(shù)中使用局部變量
技巧 12:將經(jīng)常使用的數(shù)據(jù)復制到腳本變量中
技巧 13:避免重新確定數(shù)組的維數(shù)
技巧 14:使用響應緩沖
技巧 15:批處理內(nèi)嵌腳本和 Response.Write 語句
技巧 16:如果頁面需要很長時間才能完成,那么執(zhí)行前使用 Response.IsClientConnected
技巧 17:使用 <OBJECT> 標記例示對象
技巧 18:對于 ADO 和其它組件使用 TypeLib 綁定
技巧 19:利用瀏覽器的驗證功能
技巧 20:避免在循環(huán)語句中使用字符串串聯(lián)
技巧 21:啟用瀏覽器和代理緩存
技巧 22:盡可能使用 Server.Transfer 代替 Response.Redirect
技巧 23:在目錄 URL 中使用后斜杠
技巧 24:避免使用服務器變量
技巧 25:升級到最新和最出色的
技巧 26:優(yōu)化 Web 服務器
技巧 27:進行性能測試
技巧 28:閱讀資源鏈接
引言
性能是一個特征。您必須預先設計性能,否則您以后就得重寫應用程序。就是說,有哪些好的策略可使 Active Server Pages (ASP) 應用程序性能達到最佳?

本文介紹了優(yōu)化 ASP 應用程序和 Visual Basic? Scripting Edition (VBScript) 的技巧。本文討論了許多陷阱。本文列出的建議已經(jīng)在 http://www.microsoft.com 和其它站點中進行了測試,效果十分顯著。本文假定您已經(jīng)對 ASP 開發(fā),包括 VBScript 和/或 JScript、ASP Application、ASP Session 和其它 ASP 固有對象(Request、Response 和 Server)有了基本了解。

通常,ASP 性能主要取決于 ASP 代碼本身以外的很多因素。我們不在一篇文章中羅列出所有的信息,在本文結(jié)尾處我們列出了與性能有關的資源。這些鏈接涵蓋了 ASP 和非 ASP 主題,包括 ActiveX? 數(shù)據(jù)對象 (ADO)、組件對象模型 (COM)、數(shù)據(jù)庫和 Internet Information Server (IIS) 配置。這些都是我們喜歡的一些鏈接 - 一定要去看看。

技巧 1:將經(jīng)常使用的數(shù)據(jù)緩存在 Web 服務器上
典型的 ASP 頁從后端數(shù)據(jù)存儲中檢索數(shù)據(jù),然后將結(jié)果轉(zhuǎn)換成超文本標記語言 (HTML)。無論數(shù)據(jù)庫的速度如何,從內(nèi)存中檢索數(shù)據(jù)總要比從后端數(shù)據(jù)存儲中檢索數(shù)據(jù)快得多。從本地硬盤讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫中檢索數(shù)據(jù)更快。因此,通常可以將數(shù)據(jù)緩存在 Web 服務器上(存儲在內(nèi)存或磁盤中),來提高性能。

緩存是傳統(tǒng)的以空間換取時間的做法。如果您緩存的內(nèi)容正確,那么您可以看到性能會有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復使用的數(shù)據(jù),且要重新計算這些數(shù)據(jù)需要(適度)大的開銷。如果緩存的都是些陳舊的數(shù)據(jù),就會造成內(nèi)存浪費。

不經(jīng)常發(fā)生改變的數(shù)據(jù)是很好的緩存候選數(shù)據(jù),因為您不必擔心隨著時間的遷移該數(shù)據(jù)與數(shù)據(jù)庫同步的問題。組合框列表、引用表、DHTML 碎片、擴展標記語言 (XML) 字符串、菜單項和站點配置變量(包括數(shù)據(jù)源名稱 (DSN)、Internet 協(xié)議 (IP) 地址和 Web 路徑)都是很好的緩存候選內(nèi)容。注意您可以緩存數(shù)據(jù)的“表示”,而不緩存數(shù)據(jù)本身。如果 ASP 頁很少更改,且緩存的開銷也很大(例如,整個產(chǎn)品目錄),則應考慮事先產(chǎn)生 HTML,而不是在響應每個請求時重新顯示。

應將數(shù)據(jù)緩存在哪里,有哪些緩存策略?通常,數(shù)據(jù)緩存在 Web 服務器的內(nèi)存或磁盤中。下兩個技巧講述了這兩個方法。

技巧 2: 將經(jīng)常使用的數(shù)據(jù)緩存在 Application 或 Session 對象中
ASP Application 和 Session 對象為將數(shù)據(jù)緩存在內(nèi)存中提供了方便的容器。您可以將數(shù)據(jù)指派到 Application 和 Session 對象中,這些數(shù)據(jù)在 HTTP 調(diào)用之間保留在內(nèi)存中。Session 數(shù)據(jù)是按每個用戶分別存儲的,而 Application 數(shù)據(jù)則在所有用戶之間共享。

什么時候?qū)?shù)據(jù)裝載到 Application 或 Session 中呢?通常,數(shù)據(jù)是在啟動 Application 或 Session 時裝載。要在 Application 或 Session 啟動過程中裝載數(shù)據(jù),應將適當?shù)拇a分別添加到 Application_OnStart() 或 Session_OnStart() 中。這些函數(shù)應在 Global.asa 中,如果沒有,則可以添加這些函數(shù)。還可以在第一次需要時裝載該數(shù)據(jù)。為此,在 ASP 頁中添加一些代碼(或編寫一個可重復使用的腳本函數(shù)),以檢查數(shù)據(jù)是否存在,如果不存在,就裝載數(shù)據(jù)。這是一個傳統(tǒng)的性能技術(shù),稱為“惰性計算” - 在您知道需要某一個值以前不計算該值。例如:

<%
Function GetEmploymentStatusList
Dim d
d = Application(“EmploymentStatusList”)
If d = ““ Then
' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application(“EmploymentStatusList”) = d
End If
GetEmploymentStatusList = d
End Function
%>


可以為所需要的每個數(shù)據(jù)塊編寫類似的函數(shù)。

應以什么格式存儲數(shù)據(jù)?可以存儲任何變體類型,因為所有腳本變量都是變體型。例如,您可以存儲字符串、整數(shù)或數(shù)組。通常,您將以這些變量類型之一存儲 ADO 記錄集的內(nèi)容。要從 ADO 記錄集獲取數(shù)據(jù),您可以手工將數(shù)據(jù)復制到 VBScript 變量,一次一個字段。使用一個 ADO 記錄集持久函數(shù) GetRows()、GetString() 或 Save()(ADO 2.5),可加快速度且更容易一些。其詳細情況已超出本文所討論的范圍,但下面給出了一個函數(shù)舉例,說明使用 GetRows() 返回記錄集數(shù)據(jù)的一個數(shù)組:

' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject(“ADODB.Recordset”)
rs.Open “select StatusName, StatusID from EmployeeStatus”, _
“dsn=employees;uid=sa;pwd=;”
FetchEmploymentStatusList = rs.GetRows() “ Return data as an Array
rs.Close
Set rs = Nothing
End Function


對上面舉例做更進一步改進,可以將 HTML 緩存為列表,而不是數(shù)組。下面是簡單的示例:

' Get Recordset, return as HTML Option list
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = CreateObject(“ADODB.Recordset”)
rs.Open “select StatusName, StatusID from EmployeeStatus”, _
“dsn=employees;uid=sa;pwd=;”
s = “<select name=““EmploymentStatus”“>“ & vbCrLf
Set fldName = rs.Fields(“StatusName”) ' ADO Field Binding
Do Until rs.EOF
' Next line violates Don't Do String Concats,
' but it's OK because we are building a cache
s = s & “ <option>“ & fldName & “</option>“ & vbCrLf
rs.MoveNext
Loop
s = s & “</select>“ & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function


在適當?shù)臈l件下,可以將 ADO 記錄集本身緩存在 Application 或 Session 作用域中。有兩個警告:

必須將 ADO 標記為自由線程
必須使用斷開連接的記錄集。
如果不能保證滿足這兩個要求,則不要緩存 ADO 記錄集。在下面的“非敏捷組件”和“不要緩存連接”技巧中,我們將討論將 COM 對象存儲在 Application 或 Session 作用域中的危險性。

當您將數(shù)據(jù)存儲在 Application 或 Session 作用域時,數(shù)據(jù)將保留在那里,直到您以編程方式改變它、Session 過期或 Web 應用程序重新啟動為止。如果數(shù)據(jù)需要更新怎么辦?要手工強制對 Application 數(shù)據(jù)進行更新,您可以訪問只有管理員才可訪問的 ASP 頁來更新數(shù)據(jù)。或者,您可以通過函數(shù)定期自動刷新數(shù)據(jù)。下面例子存儲帶有緩存數(shù)據(jù)的時間戳,并隔一段時間后刷新數(shù)據(jù)。

<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds

' Function to return the employment status list
Function GetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList = Application(“EmploymentStatusList”)
End Function

' Periodically update the cached data
Sub UpdateEmploymentStatusList
Dim d, strLastUpdate
strLastUpdate = Application(“LastUpdate”)
If (strLastUpdate = ““) Or _
(UPDATE_INTERVAL < DateDiff(“s”, strLastUpdate, Now)) Then

' Note: two or more calls might get in here. This is okay and will simply
' result in a few unnecessary fetches (there is a workaround for this)

' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()

' Update the Application object. Use Application.Lock()
' to ensure consistent data
Application.Lock
Application(“EmploymentStatusList”) = Events
Application(“LastUpdate”) = CStr(Now)
Application.Unlock
End If
End Sub


請參見 World's Fastest ListBox with Application Data,上面還有一個例子。

要知道在 Session 或 Application 對象中緩存大的數(shù)組不是一個好的做法。在訪問數(shù)組的任何元素之前,腳本語言的語法要求必須臨時復制整個數(shù)組。例如,如果將由字符串組成的有 100,000 個元素的數(shù)組(該數(shù)組將美國郵政編碼映射到當?shù)氐臍庀笳?#xff09;緩存在 Application 對象中,ASP 必須先將所有的 100,000 個氣象站復制到臨時數(shù)組中,然后才能提取一個字符串。在這種情況下,用自定義方法建立一個自定義組件來存儲氣象站 - 或使用一個詞典組件會更好。

再警告大家一下,不要將嬰兒與洗澡水一起倒掉:數(shù)組能快速查尋和存儲在內(nèi)存中是鄰近的關鍵數(shù)據(jù)對。索引一個詞典比索引一個數(shù)組要慢得多。應針對您的實際情況,選擇提供最佳性能的數(shù)據(jù)結(jié)構(gòu)。

技巧 3:將數(shù)據(jù)和 HTML 緩存在 Web 服務器的磁盤上
有時,數(shù)據(jù)可能太多,無法都緩存在內(nèi)存中。“太多”只是一個說法,這要看您想消耗多少內(nèi)存,以及需緩存的項目數(shù)和檢索這些項目的頻率。在任何情況下,如果數(shù)據(jù)太多而無法都緩存在內(nèi)存中,則考慮將數(shù)據(jù)以文本或 XML 文件緩存在 Web 服務器的硬盤上。可以同時將數(shù)據(jù)緩存在磁盤和內(nèi)存中,為您的站點建立最適宜的緩存策略。

注意當測量單個 ASP 頁的性能時,檢索磁盤上的數(shù)據(jù)可能不一定要比從數(shù)據(jù)庫檢索數(shù)據(jù)更快。但緩存會降低數(shù)據(jù)庫和網(wǎng)絡上的負載。在高負載的情況下,這樣做可大大改善總體吞吐量。當緩存開銷很大的查詢結(jié)果(如多表聯(lián)接或復合存儲過程)或大的結(jié)果集時,這是非常有效的。與往常一樣,要測試一下幾種方案的優(yōu)劣。

ASP 和 COM 提供一些建立基于磁盤的緩存方案的工具。ADO 記錄集 Save() 和 Open() 函數(shù)保存和裝載磁盤中的記錄集。可以使用這些方法重新編寫上面 Application 數(shù)據(jù)緩存技巧中的代碼示例,用文件的 Save() 代替寫到 Application 對象中的代碼。

有一些其它組件可以用于文件:

Scripting.FileSystemObject 可使您創(chuàng)建、讀和寫文件。
與 Internet Explorer 一起提供的 Microsoft? XML 解析器 (MSXML) 支持保存和裝載 XML 文檔。
LookupTable 對象(例如,用在 MSN 上)是從磁盤裝載簡單列表的最好選擇。
最后,應考慮將數(shù)據(jù)的表示緩存在磁盤上,而不是數(shù)據(jù)本身。預先轉(zhuǎn)換的 HTML 可以用 .htm 或 .asp 文件存儲在磁盤上,超級鏈接可以直接指向這些文件。可以使用商用工具,如 XBuilder,或 Microsoft? SQL Server? Internet 發(fā)布功能將產(chǎn)生 HTML 的過程自動化。或者,您可以將 HTML 代碼片斷放在 .asp 文件中。還可以使用 FileSystemObject 從磁盤讀取 HTML 文件,或使用 XML 盡早轉(zhuǎn)換。

技巧 4:避免將非敏捷的組件緩存在 Application 或 Session 對象中
盡管將數(shù)據(jù)緩存在 Application 或 Session 對象中是一個好的做法,但緩存 COM 對象卻有嚴重的陷阱。通常,人們傾向于將經(jīng)常使用的 COM 對象緩存到 Application 或 Session 對象中。很遺憾,許多 COM 對象(包括所有以 Visual Basic 6.0 或更低版本編寫的對象)當存儲在 Application 或 Session 對象時,會引起嚴重的瓶頸。

具體來講,當任何不敏捷的組件緩存在 Session 或 Application 對象時,將引起性能瓶頸。敏捷的組件是被標記為 ThreadingModel=Both 的組件,它聚集 Free-threaded marshaler (FTM);或被標記為 ThreadingModel=Neutral 的組件。(Neutral 模型是 Windows? 2000 和 COM+ 的新增模型。) 下列組件不是敏捷的:

自由線程的組件(除非它們聚集 FTM)。
單元線程組件。
單線程組件。
配置的組件(Microsoft Transaction Server (MTS)/COM+ 庫和服務器程序包/應用程序)不是敏捷的,除非它們是 Neutral 線程。單元線程組件和其它非敏捷的組件在頁作用域內(nèi)是最適合的(即,它們在單個 ASP 頁上創(chuàng)建和銷毀)。

在 IIS 4.0 中,被標記為 ThreadingModel=Both 的組件被認為是敏捷的。在 IIS 5.0 中,只有這一點還不夠。組件必須不僅被標記 Both,還必須聚集 FTM。有關敏捷性的文章講述了如何使以 Active Template Library 編寫的 C++ 組件聚集 FTM。要注意如果組件緩存界面指針,那么那些指針本身必須是敏捷的,或必須存儲在 COM 共用界面表 (GIT) 中。如果您不能重新編譯 Both 線程組件以聚集 FTM,那么您可以將組件標記為 ThreadingModel=Neutral。或者,如果您不想讓 IIS 執(zhí)行敏捷性檢查(因此,您可以允許非敏捷的組件存儲在 Application 或 Session 作用域中),您可以在配置數(shù)據(jù)庫中將 AspTrackThreadingModel 設置為 True。不建議更改 AspTrackThreadingModel。

如果您想將以 Server.CreateObject 創(chuàng)建的非敏捷的組件存儲在 Application 對象中,IIS 5.0 將出現(xiàn)一個錯誤。您可以在 Global.asa 中使用 <object runat=server scope=application ...> 避免這一錯誤,但不建議這樣做,因為這會導致匯集和串行化,關于這一點將在下面講述。

如果您緩存非敏捷的組件會出現(xiàn)什么毛病?緩存在 Session 對象中的非敏捷的組件將 Session 鎖定于 ASP 工作者線程。ASP 維護一個工作者線程池來處理請求。通常情況下,一個新請求總是由第一個可用的工作者線程來處理。如果 Session 被鎖定于一個線程,那么請求必須等到其相關的線程可用為止。這里有一個類比,也許會有所幫助:您去一家超級市場,挑選了一些商品,并在 #_3 收款臺付款。其后,每當您在那家超級市場為商品付款時,您總是必須在 #_3 收款臺付款,即使其它收款臺前排隊的人較少或者沒有人排隊,也是如此。

將非敏捷的組件存儲在 Application 作用域?qū)π阅艿挠绊懮踔粮鼔摹SP 必須創(chuàng)建一個特殊的線程運行存儲在 Application 作用域中的非敏捷組件。這會有兩個結(jié)果:所有調(diào)用都必須匯集到此線程,且所有調(diào)用都排成長隊。“匯集”的意思是參數(shù)必須存儲在內(nèi)存的共享區(qū)域;執(zhí)行一個開銷很大的到特殊線程的上下文切換;執(zhí)行組件的方法;將結(jié)果匯集到共享區(qū)域;執(zhí)行另一個開銷很大的上下文切換,將控制返回到原始的線程。“串行化”意思是指每次只運行一個方法。兩個不同的 ASP 工作者線程不能同時在共享組件上執(zhí)行多個方法。這樣就杜絕了并發(fā)性,特別是在多處理器計算機上。更糟的是,所有非敏捷的 Application 作用域的組件共享一個線程(主機 STA),因此串行化的影響甚至更顯著。

如之奈何?下面是一些一般的規(guī)則。如果您使用 Visual Basic (6.0) 或更早版本編寫對象,那么不要將它們緩存在 Application 或 Session 對象中。如果您不知道對象的線程模型,不要緩存它。不要緩存非敏捷的對象,而應在每個頁面創(chuàng)建和釋放它們。對象直接在 ASP 工作者線程上運行,因此沒有匯集或串行化。如果 COM 對象在 IIS 服務器上運行,且如果它們不花長時間初始化和刪除,性能尚可。注意單線程對象不應該這樣使用。小心 - VB 可創(chuàng)建單線程對象!如果您必須這樣使用單線程對象(如 Microsoft Excel 電子表格),別指望會有很高的吞吐量。

當 ADO 被標記為自由線程,ADO 記錄集可以安全地緩存。要將 ADO 標記為自由線程,使用 Makfre15.bat 文件,該文件通常位于目錄 \\Program Files\Common\System\ADO 中。

警告 如果您使用 Microsoft Access 作為數(shù)據(jù)庫,不應將 ADO 標記為自由線程的。ADO 記錄集也必須切斷連接。一般來說,如果您不能控制站點中的 ADO 配置(例如,您是一個獨立的軟件廠商 [ISV],向管理他們自己的配置客戶銷售 Web 應用程序),最好不要緩存記錄集。

詞典組件也是敏捷的對象。LookupTable 從數(shù)據(jù)文件中裝載其數(shù)據(jù),可用于組合框數(shù)據(jù)和配置信息。Duwamish Books 中的 PageCache 對象可提供詞典語法,Caprock Dictionary 也可提供。這些對象或其派生對象可以構(gòu)成有效緩存策略的基礎。注意 Scripting.Dictionary 對象不是敏捷的,不應該存儲在 Application 或 Session 作用域中。

技巧 5:不要將數(shù)據(jù)庫連接緩存在 Application 或 Session 對象中
緩存 ADO 連接通常是很糟糕的策略。如果一個 Connection 對象存儲在 Application 對象中,并在所有的頁面中使用,那么所有頁面將爭搶這一連接。如果 Connection 對象存儲在 ASP Session 對象中,那么將為每個用戶創(chuàng)建數(shù)據(jù)庫連接。這就會使連接池的優(yōu)勢蕩然無存,并給 Web 服務器和數(shù)據(jù)庫帶來不必要的壓力。

可以不緩存數(shù)據(jù)庫連接,而是在使用 ADO 的每個 ASP 頁面中創(chuàng)建和刪除 ADO 對象。這是很有效的,因為 IIS 內(nèi)嵌了數(shù)據(jù)庫連接池。更準確地說,IIS 自動啟用 OLEDB 和 ODBC 連接池。這就能確保在每個頁面上創(chuàng)建和刪除連接將是有效的。

因為連接的記錄集存儲一個到數(shù)據(jù)庫連接的引用,所以您不應將連接的記錄集緩存在 Application 或 Session 對象中。但是,您可以安全地緩存斷開連接的記錄集,它們不保存到其數(shù)據(jù)連接的引用。要斷開記錄集連接,執(zhí)行下面的兩個步驟:

Set rs = Server.CreateObject(“ADODB.RecordSet”)
rs.CursorLocation = adUseClient ' step 1

' Populate the recordset with data
rs.Open strQuery, strProv

' Now disconnect the recordset from the data provider and data source
rs.ActiveConnection = Nothing ' step 2


有關連接池的更詳細信息,可以在 ADO 和 SQL Server 參考資料中找到。

技巧 6:合理地使用 Session 對象
既然我們已經(jīng)討論了緩存在 Application 和 Session 中的優(yōu)點,現(xiàn)在開始討論避免使用 Session 對象的問題。正如下面所討論的,當與忙的站點一起使用時,Session 有幾個缺點。“忙”的意思一般是指一秒鐘要求幾百頁面或成千上萬同時用戶的站點。這個技巧對于必須水平擴展的站點 - 即,那些利用多臺服務器以處理負載或?qū)崿F(xiàn)容錯的站點 - 甚至更重要。對于較小的站點,諸如 Intranet 站點,要想實現(xiàn) Session 帶來的方,必然增大系統(tǒng)開銷。

簡言之,ASP 自動為每個訪問 Web 服務器的用戶創(chuàng)建一個 Session。每個 Session 大約需要 10 KB 的內(nèi)存開銷(最主要的是數(shù)據(jù)存儲在 Session 中),這就使所有的請求都減慢。在配置的超時時段(通常是 20 分鐘)結(jié)束以前,Session 一直保留有效。

Session 的最大的問題不是性能,而是可擴展性。Session 不能跨越幾臺 Web 服務器,一旦在一臺服務器上創(chuàng)建 Session,其數(shù)據(jù)就留在那兒。這就意味著如果您在一個 Web 服務器群使用 Session,您必須設計一個策略,將每個用戶請求始終發(fā)到用戶 Session 所在的那臺服務器上。這被稱為將用戶“粘”在 Web 服務器上。術(shù)語“粘性會話”就是從這里派生而來的。如果 Web 服務器崩潰,被“粘住的”用戶將丟失他們的會話狀態(tài),因為會話不是粘到磁盤上。

實現(xiàn)粘性會話的策略包括硬件和軟件解決方案。諸如 Windows 2000 Advanced Server 中的網(wǎng)絡負載平衡和 Cisco 的 Local Director 之類的解決方案都可以實現(xiàn)粘性會話,代價是要損失一定程度的可擴展性。這些解決方案是不完善的。不建議此時部署您自己的軟件解決方案(我們過去常常使用 ISAPI 篩選器和 URL 轉(zhuǎn)換等等)。

Application 對象也不跨越多臺服務器,如果您必須跨越 Web 服務器群共享和更新 Application 數(shù)據(jù),您必須使用后端數(shù)據(jù)庫。但是,只讀 Application 數(shù)據(jù)在 Web 服務器群中仍是有用的。

如果只是因為要增加運行時間(處理故障轉(zhuǎn)移和服務器維護),大多數(shù)關鍵任務站點至少需部署兩臺 Web 服務器。因此,在設計關鍵任務應用程序時,必須實現(xiàn)“粘性會話”,或干脆避免使用 Session,以及任何其它將用戶狀態(tài)存儲在單個 Web 服務器上的狀態(tài)管理技術(shù)。

如果您不使用 Session,一定要將它們關閉。您可以通過 Internet Services Manager,為應用程序執(zhí)行此操作(參見 ISM 文檔)。如果您決定使用 Session,您可以采用一些方法減輕它們對性能的影響。

您可以將不需要 Session 的內(nèi)容(如幫助屏幕,訪問者區(qū)域等等)移到另一個關閉了 Session 的 ASP 應用程序中。您可以逐頁提示 ASP,您不再需要該頁面上的 Session 對象,使用以下放在 ASP 頁面最上面的指令:

<% @EnableSessionState=False %>


使用這一指令有一個很好的理由是,這些 Session 在框架集方面存在一個有意思的問題。ASP 保證任何時候 Session 只有一個請求執(zhí)行。這樣就確保如果瀏覽器為一個用戶請求多個頁面,一次只有一個 ASP 請求接觸 Session,這樣就避免了當訪問 Session 對象時發(fā)生的多線程問題。很遺憾,一個框架集中的所有頁面將以串行方式顯示,一個接一個,而不是同時顯示。用戶可能必須等候很長時間,才能看到所有的框架。該故事的寓意:如果某些框架集頁面不依靠 Session,一定要使用 @EnableSessionState=False 指令告訴 ASP。

有許多管理 Session 狀態(tài)的方法,可替代 Session 對象的使用。對于少量的狀態(tài)(少于 4 KB),我們通常建議使用 Cookies、QueryString 變量和隱式變量。對于更大數(shù)據(jù)量,如購物小車,后端數(shù)據(jù)庫是最適合的選擇。有關 Web 服務器群中狀態(tài)管理技術(shù)的文章很多。有關詳細信息,請參見 Session 狀態(tài)參考資料。

技巧 7: 將代碼封裝在 COM 對象中
如果您有許多 VBScript 或 JScript,您可以經(jīng)常將代碼移到編譯的 COM 對象中,從而可改善性能。編譯的代碼通常比解釋的代碼運行得更快。編譯的 COM 對象可以通過“早綁定”訪問其它 COM 對象,與腳本使用的“晚綁定”相比,“早綁定”是調(diào)用 COM 對象的更有效方法。

將代碼封裝在 COM 對象中還有一些優(yōu)點(除性能之外):

COM 對象有利于將表示邏輯與業(yè)務邏輯分開。
COM 對象可以保證代碼重復使用。
許多開發(fā)人員發(fā)現(xiàn)以 VB、C++ 或 Visual J++ 編寫的代碼比 ASP 更容易調(diào)試。
COM 對象也有缺點,包括初始開發(fā)時間和需要不同的程序設計技巧。注意封裝少量的 ASP 可能引起性能下降,而不會得到性能改進。這種情況通常在少量的 ASP 代碼被封裝進 COM 對象時發(fā)生。在這種情況下,創(chuàng)建和調(diào)用 COM 對象的系統(tǒng)開銷超過了編譯的代碼的優(yōu)點。應反復地試驗,以確定什么樣的 ASP 腳本和 COM 對象代碼的組合產(chǎn)生最好的性能。注意,與 Microsoft Windows NT? 4.0/IIS 4.0 相比,Windows 2000/IIS 5.0 中在腳本和 ADO 性能方面有了很大的改進。因此,隨著 IIS 5.0 的推出,編譯代碼比 ASP 代碼的性能優(yōu)勢有所降低。

有關在 ASP 中使用 COM 的優(yōu)點和缺點的詳細討論,參見 ASP Component Guidelines and Programming Distributed Applications with and Microsoft Visual Basic 6.0。如果您部署 COM 組件,以負荷對它們進行測試特別重要。事實上,理所當然應對所有的 ASP 應用程序進行負荷測試。

技巧 8:遲一點獲得資源,早一點釋放資源
這里是一個小技巧供您參考。一般來說,最好遲一點獲得資源,早一點釋放資源。這適用于 COM 對象以及文件句柄和其它資源。

這種優(yōu)化方法主要用于 ADO 連接和記錄集。當您使用完記錄集,比方說在顯示一個表及其數(shù)據(jù)之后,應立即釋放它,而不是等到頁面結(jié)束時再釋放。將 VBScript 變量設置為 Nothing 是最好的做法。不要讓記錄集超出作用域之外。而且,要釋放任何相關的 Command 或 Connection 對象(在將記錄集或連接設置為 = Nothing 之前,不要忘記調(diào)用 Close())。這會縮短數(shù)據(jù)庫必須為您準備資源的時間,并盡快釋放數(shù)據(jù)庫到連接池的連接。

技巧 9:進程外執(zhí)行過程以性能換取可靠性
ASP 和 MTS/COM+ 兩者都有配置選項,可使您兼顧可靠性和性能。當建立和部署應用程序時,應知道如何兼顧兩者的性能。

ASP 選項
可以配置 ASP 應用程序,以便以三種方法之一運行。在 IIS 5.0 中,引入了“隔離級”這一術(shù)語以說明這些選項。這三個隔離級分別是低級、中級和高級:

低級隔離。這在 IIS 的所有版本中都得到支持,且是最快的。它在 Inetinfo.exe 中運行 ASP,Inetinfo.exe 是主要 IIS 進程。如果 ASP 應用程序崩潰,IIS 也會崩潰。(要在 IIS 4.0 下重新啟動 IIS,Web 站點管理員應使用諸如 InetMon 之類的工具監(jiān)視站點,如果服務器發(fā)生故障,應啟用批處理文件以重新啟動服務器。IIS 5.0 引入了可靠的重新啟動,該方法可使發(fā)生故障的服務器自動重新啟動。)
中級隔離。IIS 5.0 引入了這個新的級別,它被稱為進程外級別,因為 ASP 在 IIS 進程之外運行。在中級隔離中,被配置作為中級隔離運行的所有 ASP 應用程序都共享一個進程空間。這就減少了在一臺服務器運行多個進程外 ASP 應用程序所需要的進程數(shù)量。中級隔離是 IIS 5.0 中的默認隔離級別。
高級隔離。在 IIS 4.0 和 IIS 5.0 中支持這一級別,高級隔離也是進程外的。如果 ASP 崩潰,Web 服務器并不會崩潰。下次 ASP 請求時,ASP 應用程序就會自動重新啟動。在高級隔離中,配置作為高級隔離運行的每個 ASP 應用程序都在其自有進程空間中運行。這樣做可保護 ASP 應用程序彼此之間不相互干擾。其缺點是它要求每個 ASP 應用程序都要有一個單獨的進程。當在一臺服務器上必須運行許多應用程序時,系統(tǒng)開銷就會大大增加。
哪個選項最好的呢?在 IIS 4.0 中,進程外運行將顯著降低性能。在 IIS 5.0 中,做了許多改進,將進程外運行 ASP 應用程序所產(chǎn)生的開銷降到最低限度。事實上,在絕大多數(shù)測試中,IIS 5.0 中的 ASP 進程外應用程序比 IIS 4.0 中的進程內(nèi)應用程序運行得更快。不管怎樣,在兩個平臺上,進程內(nèi)(低隔離級)性能最佳。但是,如果訪問率相對較低或最大吞吐量較低,低隔離級的優(yōu)勢不太明顯。因此,在您每一 Web 服務器每秒鐘需要數(shù)百或成千上萬頁面時,才會覺得有必要設置低隔離級。與往常一樣,應對多種配置進行測試,確定您要采取哪一種折衷方案。

注意 當您運行 ASP 進程外應用程序時(中級或高級隔離),它們在 NT4 中的 MTS 和在 Windows 2000 中的 COM+ 中運行。即,在 NT4 中它們在 Mtx.exe 中運行;而在 Windows 2000 中,它們在 DllHost.exe 中運行。您可以在任務管理器中看到這些進程在運行。您還可以看到 IIS 如何為進程外 ASP 應用程序配置 MTS 程序包或 COM+ 應用程序。

COM 選項
COM 組件也有三種配置選項,雖然與 ASP 選項不完全類似。COM 組件可以是“未配置的”、配置為庫應用程序或配置為服務器應用程序。“未配置的”意思是指組件沒有注冊 COM+。組件將在調(diào)用程序的進程空間運行,那就是說,它們是“進程內(nèi)的”。庫應用程序也是進程內(nèi)的,但使用 COM+ 的服務,包括安全、事務和上下文支持。服務器應用程序被配置為在它們自有的進程空間內(nèi)運行。

您可以看到未配置的組件比庫應用程序略有一些優(yōu)勢。庫應用程序比服務器應用程序的性能優(yōu)點更大。這是因為庫應用程序與 ASP 在同一進程內(nèi)運行,而服務器應用程序在它們的自有進程內(nèi)運行。進程間的調(diào)用比進程內(nèi)調(diào)用開銷更大。而且,當在進程之間傳遞諸如記錄集之類的數(shù)據(jù)時,必須在兩個進程之間復制所有的數(shù)據(jù)。

陷阱!當使用 COM 服務器應用程序時,如果您在 ASP 和 COM 之間傳遞對象,要確保對象執(zhí)行“按值匯集”或 MBV。執(zhí)行 MBV 的對象將它們自己從一個進程復制到另一個進程。這比下面一種方法好,采用這種方法時,對象仍在創(chuàng)建者的進程中,另外一個進程反復地調(diào)用創(chuàng)建進程以使用該對象。切斷連接的 ADO 記錄集將“按值匯集”,連接的記錄集則不然。Scripting.Dictionary 不執(zhí)行 MBV,且不在進程之間傳遞。最后,VB 程序員請注意:MBV 不通過傳遞參數(shù) ByVal 獲得。MBV 由原始的組件作者執(zhí)行。

怎么辦?
如果讓我們建議一個兼顧性能與可靠性的合理配置,它們應是如下的配置:

在 IIS 4.0 中,使用 ASP 低隔離級別,使用 MTS 服務器程序包。
在 IIS 5.0 上,使用 ASP 的中隔離級,并使用 COM+ 庫應用程序。
這些是非常一般的原則,主機服務公司一般情況下以中或高隔離級運行 ASP,而單用途的 Web 服務器可以以低隔離級運行。衡量各種利弊,并自己決定哪個配置更能符合您的需要。

技巧 10:使用顯式選項
在 .asp 文件中應使用 Option Explicit。此指令放在 .asp 文件的最上面,它強制開發(fā)人員聲明要使用到的所有變量。許多程序員認為這種方法對于調(diào)試應用程序很有幫助,因為這種方法避免了鍵錯變量名和誤建新變量的可能性(例如,將 MyXMLString=) 錯寫成 MyXLMString=...。

更重要的一點也許是,聲明的變量比未聲明的變量速度更快。由此,腳本在運行時每次用到未聲明的變量時,按名稱引用它。另一方面,聲明的變量是有順序的,要么以編譯時間,要么以運行時間。以后,聲明的變量都按此順序引用。因為 Option Explicit 強制變量聲明,它能確保聲明所有變量,因此訪問的速度也很快。

技巧 11:在子例程和函數(shù)中使用局部變量
局部變量是那些在子例程和函數(shù)內(nèi)聲明的變量。在函數(shù)或子例程內(nèi),局部變量訪問比全局變量訪問更快。局部變量的使用也會使代碼更清晰,因此應盡量使用局部變量。

技巧 12:將經(jīng)常使用的數(shù)據(jù)復制到腳本變量中
當訪問 ASP 中的 COM 對象時,應將經(jīng)常使用的對象數(shù)據(jù)復制到腳本變量中。這樣做可減少 COM 方法調(diào)用,因為 COM 方法調(diào)用與訪問腳本變量相比,開銷相對較大。當訪問 Collection 和 Dictionary 對象時,這種技術(shù)也會減少開銷很大的查找。

一般來說,如果您打算不止一次訪問對象數(shù)據(jù),那么就應將數(shù)據(jù)放到腳本變量中。這種優(yōu)化的主要目標是 Request 變量(Form 和 QueryString 變量)。例如,您的站點可傳遞一個名為 UserID 的 QueryString 變量。假設此 UserID 在特定頁面上被引用 12 次。可以無須調(diào)用 Request(“UserID”) 12 次,而是在 ASP 頁面最上面將 UserID 指派到一個變量。然后在該頁面自始至終使用該變量。這樣就省去了 11 次 COM 方法調(diào)用。

實際上,訪問 COM 屬性或方法的開銷并沒有那么大。下面舉一個例子,說明某相當常見的代碼(從語法上講):

Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...


當此代碼運行時,下面是發(fā)生的情況:

變量 Foo 被解析為全局對象。
變量 bar 被解析為 Foo 的成員。這實際就是一次 COM 方法調(diào)用。
變量 blah 被解析為 Foo.bar 的成員。這又是一次 COM 方法調(diào)用。
變量 qaz 被解析為 foo.bar.blah 的成員。沒有錯,這還是一次 COM 方法調(diào)用。
調(diào)用 Foo.bar.blah.quaz(1)。再一次 COM 方法調(diào)用。懂了嗎?
再次執(zhí)行步驟 1 至步驟 3 以解析 baz。系統(tǒng)并不知道調(diào)用 qaz 是否改變對象模型,因此必須再次執(zhí)行步驟 1 至 3 以解析 baz。
將 baz 解析為 Foo.bar.blah 的成員。賦予屬性。
再次執(zhí)行步驟 1 至步驟 3 以解析 zaq。
再次執(zhí)行步驟 1 至步驟 3 以解析 abc。
正如您可看到的,效率相當差(且慢)。以 VBScript 寫此代碼的快速方法是:

Set myobj = Foo.bar.blah ' do the resolution of blah ONCE
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...


如果您使用 VBScript 5.0 或更高版本,您可以使用 With 語句寫此代碼:

With Foo.bar.blah
.baz = .qaz(1)
If .zaq = .abc Then '...
...
End With


注意此技巧也適用于 VB 程序設計。

技巧 13:避免重新確定數(shù)組的維數(shù)
應盡量避免 Redim 數(shù)組。就性能而言,如果計算機的物理內(nèi)存大小有限,最好將數(shù)組的初始維數(shù)設置為其最不利的情況 - 或?qū)⒕S數(shù)設置為其最佳的情況,然后再按需要重新確定維數(shù)。這并非意味著,如果知道您不需要內(nèi)存時,就隨便分配幾兆字節(jié)的內(nèi)存。

下面的代碼給您顯示使用 Dim 和 Redim 不當?shù)那樾巍?

<%
Dim MyArray()
Redim MyArray(2)
MyArray(0) = “hello”
MyArray(1) = “good-bye”
MyArray(2) = “farewell”
...
' some other code where you end up needing more space happens, then ...
Redim Preserve MyArray(5)
MyArray(3) = “more stuff”
MyArray(4) = “even more stuff”
MyArray(5) = “yet more stuff”
%>


最好一開始就將數(shù)組的初始大小 Dim 正確(在本例中,是 5)比 Redim 數(shù)組使其更大好得多。您可能浪費一些內(nèi)存(如果您沒有使用所有的元素),但獲得的好處是速度變得更快。

技巧 14:使用響應緩沖
您可以通過啟用“響應緩沖”,將要輸出的一整頁緩沖起來。這樣就將寫到瀏覽器的量減到最少,從而改善總體性能。每個寫操作都會產(chǎn)生很大的系統(tǒng)開銷(在 IIS 中以及在通過網(wǎng)絡發(fā)送的數(shù)據(jù)量方面),因此寫操作越少越好。由于其啟動慢且使用 Nagling 算法(用來減輕網(wǎng)絡塞車情況),TCP/IP 在發(fā)送一些大的數(shù)據(jù)塊時比必須發(fā)送許多小的數(shù)據(jù)塊時的效率高得多。

有兩個方法啟用響應緩沖。第一種,您可以使用 Internet Services Manager 為整個應用程序啟用響應緩沖。我們建議采用這種方法,在 IIS 4.0 和 IIS 5.0 中默認為新的 ASP 應用程序啟用響應緩沖。第二種,可以在每個 ASP 頁面的接近頂端的地方加入下面的代碼行,從而啟用響應緩沖:

<% Response.Buffer = True %>


此代碼行必須在任何響應數(shù)據(jù)被寫到瀏覽器之前執(zhí)行(即,在任何 HTML 出現(xiàn)在 ASP 腳本之前以及在使用 Response.Cookies 集合設置任何 Cookies 之前)。一般來說,最好為整個應用程序啟用響應緩沖。這樣,您就不必在每個頁面最上面寫入上述的代碼行。

Response.Flush
關于響應緩沖有一個常見的抱怨,就是用戶感覺到 ASP 頁面的響應速度很慢(即使整個響應時間得到改進),因為他們必須等到整個頁面生成,然后他們才能看到東西。對于運行時間長的頁面,您可以設置 Response.Buffer = False,禁用響應緩沖。但是,一個更好的策略是利用 Response.Flush 方法。這種方法將 ASP 轉(zhuǎn)換的所有 HTML 送到瀏覽器。例如,在轉(zhuǎn)換 1,000 行的表的前 100 行之后,ASP 可以調(diào)用 Response.Flush,強制將轉(zhuǎn)換的結(jié)果送到瀏覽器,這樣可使用戶在其余的行準備好之前看到頭 100 行。這種技術(shù)可以將響應緩沖與瀏覽器逐漸顯示數(shù)據(jù)完美地結(jié)合在一起。

(注意在上面的 1,000 行表的舉例中,許多瀏覽器在它們看到關閉 </table> 標記之前不會開始顯示表。檢查您的目標瀏覽器是否支持。為避免這種情況,將表分成多個具有較少行的表,并在每個表之后調(diào)用 Response.Flush。較新版本的 Internet Explorer 在表完全下載之前就開始顯示表,如果您指定表列寬,顯示速度就會特別快,這樣做可避免強制 Internet Explorer 通過測量每個單元格的內(nèi)容寬度來計算列寬。)

另一個關于響應緩沖的常見的抱怨是,當產(chǎn)生非常大的頁面時,將占用許多服務器內(nèi)存。撇開產(chǎn)生大頁面的方法不談,這種問題也可通過巧妙使用 Response.Flush 來加以解決。

技巧 15:批處理內(nèi)嵌腳本和 Response.Write 語句
VBScript 語法 <% = expression %> 將“expression”的值寫到 ASP 輸出流中。如果響應緩沖未啟用,那么執(zhí)行其中的每一條語句,都會以許多小的數(shù)據(jù)包通過網(wǎng)絡將數(shù)據(jù)寫到瀏覽器中。這樣速度很慢。而且穿插執(zhí)行少量的腳本和 HTML,將引起腳本引擎和 HTML 之間的切換,從而降低性能。因此,使用下面的技巧:使用 Response.Write 調(diào)用代替捆綁緊密的內(nèi)嵌表達式。例如,在下面的示例中,在每一行的每一字段對響應流有一次寫操作,每一行在 VBScript 和 HTML 之間有許多切換:

<table>
<% For Each fld in rs.Fields %>
<th><% = fld.Name %></th>
<%
Next
While Not rs.EOF
%>
<tr>
<% For Each fld in rs.Fields %>
<td><% = fld.Value %></td>
<% Next
</tr>
<% rs.MoveNext
Wend %>
</table>


下面的代碼更有效,每一行對響應流有一次寫操作。所有的代碼都包含在一個 VBScript 塊內(nèi):

<table>
<%
For each fld in rs.Fields
Response.Write (“<th>“ & fld.Name & “</th>“ & vbCrLf)
Next
While Not rs.EOF
Response.Write (“<tr>“)
For Each fld in rs.Fields %>
Response.Write(“<td>“ & fld.Value & “</td>“ & vbCrLf)
Next
Response.Write “</tr>“
Wend
%>
</table>


當禁用響應緩沖時,這一技巧的效果特別大。最好啟用響應緩沖,然后看批處理 Response.Write 是否有助于提高性能。

(在這一特定舉例中,建立表主體的嵌套循環(huán) (While Not rs.EOF...) 可以用仔細構(gòu)建的 GetString 調(diào)用來替代。)

技巧 16:如果頁面需要很長時間才能完成,那么執(zhí)行前使用 Response.IsClientConnected
如果用戶性急,他們可能會在您開始執(zhí)行他們的請求之前,就會放棄 ASP 頁面。如果他們單擊刷新或移到服務器上的另一個頁面,在 ASP 請求隊列的末尾就有一個新的請求等候,在隊列的中間有一個斷開連接的請求。當服務器的負載很高時(因此請求隊列就會很長,響應時間也會相應地變長),就會經(jīng)常發(fā)生這種情況,這樣只能使情況變得更糟。如果用戶不再連接,執(zhí)行 ASP 頁面(特別是慢的、大的 ASP 頁面)已沒有任何意義。您可以使用 Response.IsClientConnected 屬性檢查這一情況。如果它返回 False,則應調(diào)用 Response.End 并放棄頁的其余部分。事實上,IIS 5.0 已將這一做法編為程序 - 每當 ASP 即將執(zhí)行新請求時,它就會檢查請求在隊列中已等候了多長時間。如果已經(jīng)在那里等候了多于 3 秒鐘,ASP 將檢查客戶機是否仍處于連接狀態(tài),如果沒有連接,就立即終止請求。您可以在配置數(shù)據(jù)庫中使用 AspQueueConnectionTestTime 設置將超時時間由 3 秒調(diào)整為其它值。

如果頁面要花很長時間才能執(zhí)行完,也可以不時地檢查 Response.IsClientConnected。當啟用了響應緩沖時,最好不時地執(zhí)行 Response.Flush,以用戶知道,正在發(fā)生什么事。

注意 在 IIS 4.0 上,除非先執(zhí)行了 Response.Write,否則 Response.IsClientConnected 就不能正常工作。如果啟用了緩沖,您也必須執(zhí)行 Response.Flush。在 IIS 5.0 上,卻沒有必要這樣做,- Response.IsClientConnected 工作正常。在任何情況下,Response.IsClientConnected 都會有一些開銷,因此只有在一個操作至少要花(比方說) 500 毫秒(如果您想維持每秒鐘數(shù)十頁的吞吐量,這是一個很長的時間)才使用它。經(jīng)驗表明,不要每次重復執(zhí)行緊密循環(huán)時都調(diào)用它,如顯示表的許多行時 - 每隔二十或五十行調(diào)用一次可能比較合適。

技巧 17:使用 <OBJECT> 標記例示對象
如果要引用不在所有代碼路徑(特別是服務器或應用程序作用域的對象)中使用的對象,使用 Global.asa 中 <object runat=server id=objname> 標記聲明它們,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即創(chuàng)建對象。如果以后不再使用該對象,您就浪費了資源。<object id=objname> 標記聲明 objname,但在其方法或?qū)傩缘谝淮问褂靡郧?#xff0c;不會創(chuàng)建 objname。

這又是一個惰性計算的例子。

技巧 18:對于 ADO 和其它組件使用 TypeLib 聲明
當使用 ADO 時,開發(fā)人員經(jīng)常加入 adovbs.txt,以訪問 ADO 的各種常量。在要使用常量的每個頁面中必須包含此文件。此常量文件相當大,給每個 ASP 頁面的編譯時間和腳本大小增加了許多系統(tǒng)開銷。

IIS 5.0 引入了綁定到組件類型庫的功能。這可使您引用類型庫一次,并將其用在每個 ASP 頁面上。每個頁面不會產(chǎn)生編譯常量文件的開銷,且組件開發(fā)人員不必建立 VBScript#_include 文件以在 ASP 上使用。

要訪問 ADO TypeLib,將下面一條語句放在 Global.asa 中。

<!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library"
TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->




<!-- METADATA TYPE="TypeLib"
FILE="C:\Program Files\Common Files\system\ado\msado15.dll" -->


技巧 19: 利用瀏覽器的驗證功能
現(xiàn)今的瀏覽器對一些高級功能如 XML、DHTML、Java 小程序和遠程數(shù)據(jù)服務提供支持。盡可能使用這些功能。所有這些技術(shù)都可以執(zhí)行客戶機端驗證和數(shù)據(jù)緩存,免去了到 Web 服務器的往返。如果您在運行一個智能瀏覽器,那么瀏覽器就能為您進行一些驗證(例如,在執(zhí)行 POST 之前,檢查信用卡校驗和是否有效)。盡可能使用這一功能。通過減少客戶-服務器之間的往返,可降低 Web 服務器上的負載,并能減少網(wǎng)絡通信量(雖然發(fā)送到瀏覽器的第一個頁面可能比較大)以及服務器訪問的任何后端資源。此外,用戶不必像住常一樣讀取新頁,從而用戶的感覺會好一些。這樣做并不意味著您可以不進行服務器端驗證 - 您還應始終進行服務器端驗證。這可以防止由于某種原因(如黑客,或瀏覽器不運行客戶機端驗證例程)客戶機產(chǎn)生錯誤的數(shù)據(jù)。

人們已經(jīng)進行了大量的工作,開發(fā)“獨立于瀏覽器”的 HTML。正是由于這種憂慮,開發(fā)人員不愿再使用流行的瀏覽器功能,但這些功能本可以改善性能。對于一些真正的高性能站點,必須關心瀏覽器“訪問”問題,一個好的策略是優(yōu)化頁面,使其適應流行的瀏覽器。使用瀏覽器功能組件,可以在 ASP 中方便地檢測到瀏覽器功能。Microsoft FrontPage 等工具有助于設計適合于瀏覽器和指定 HTML 版本的代碼。參見 When is Better Worse?Weighing the Technology Trade-Offs,以了解更進一步的討論。

技巧 20:避免在循環(huán)語句中使用字符串串聯(lián)
許多人在循環(huán)語句中建立一個字符串,如下所示:

s = "<table>" & vbCrLf
For Each fld in rs.Fields
s = s & " <th>" & fld.Name & "</th> "
Next

While Not rs.EOF
s = s & vbCrLf & " <tr>"
For Each fld in rs.Fields
s = s & " <td>" & fld.Value & "</td> "
Next
s = s & " </tr>"
rs.MoveNext
Wend

s = s & vbCrLf & "</table>" & vbCrLf
Response.Write s


采用這種方法會出現(xiàn)一些問題。第一個問題是反復串聯(lián)字符串需要花兩次方的時間,更通俗地說,運行這種循環(huán)語句所花的時間與記錄數(shù)乘以字段數(shù)所得值的平方成正比。舉一個更簡單的例子,就可以更清楚地說明這一問題。

s = ""
For i = Asc("A") to Asc("Z")
s = s & Chr(i)
Next


在第一次迭代中,您獲得了一個字符的字符串 "A"。在第二次迭代中,VBScript 必須重新分配字符串并將兩個字符 ("AB") 復制到 s 中。在第三次迭代中,它還必須再次重新分配 s 并將三個字符復制到 s 中。在 N 次(第 26 次)迭代中,它必須重新分配并將 N 個字符復制到 s 中。總共就是 1+2+3+...+N,即 N*(N+1)/2 次復制。

在上面的記錄集舉例中,如果有 100 個記錄和 5 個字段,內(nèi)循環(huán)將執(zhí)行 100*5 = 500 次,所有的復制和重新分配所花的時間與 500*500 = 250,000 成正比。這對于中等大小的記錄集來說復制操作太多了。

在本例中,代碼可以用 Response.Write() 或內(nèi)嵌腳本 (<% = fld.Value %>) 替代字符串串聯(lián)來改進。如果啟用了響應緩沖的話(應該的),這樣做就會更快,因為 Response.Write 只將數(shù)據(jù)附加到響應緩沖的末尾。并不涉及重新分配,因此效率很高。

在將 ADO 記錄集轉(zhuǎn)換為 HTML 表的特定情況下,應考慮使用 GetRows 或 GetString。

如果在 JScript 中串聯(lián)字符串,特別建議使用 += 運算符,即,使用 s += "某字符串",而不使用 s = s + "某字符串"。

技巧 21:啟用瀏覽器和代理緩存
在默認情況下,ASP 禁止在瀏覽器和代理中進行緩存。這是有意義的,因為就實質(zhì)而言 ASP 頁面是動態(tài)的,上面有隨時間不斷變化的潛在信息。如果頁面不要求在每個視圖上進行刷新,您應啟用瀏覽器和代理緩存。這可使瀏覽器和代理在一定的時間內(nèi)使用頁面的“緩存”副本,您可以控制時間的長短。緩存可以大大減輕服務器上的負載,縮短用戶的等待時間。

哪一種動態(tài)頁面可作為要緩存的頁面呢?下面舉一些例子:

天氣預報頁面,在此頁面上,每隔 5 分鐘更新一次天氣預報。
列出新聞條目或新聞稿的主頁,它一天更新兩次。
共同基金業(yè)績列表,在此列表中,基本統(tǒng)計信息每隔幾小時更新一次。
注意,在使用瀏覽器或代理緩存的情況下,Web 服務器上記錄的訪問次數(shù)減少了。如果您想準確地測量所有頁面視圖或張?zhí)?#xff0c;您就不希望使用瀏覽器和代理緩存。

瀏覽器緩存由 HTTP“過期”報頭控制,該報頭由 Web 服務器發(fā)送給瀏覽器。ASP 提供兩個簡單的機制發(fā)送此報頭。要設置頁面使其過多少分鐘后到期,則應設置 Response.Expires 屬性。下面的例子告訴瀏覽器內(nèi)容在 10 分鐘內(nèi)過期:

<% Response.Expires = 10 %>


若將 Response.Expires 設置為負數(shù)或 0,則禁用緩存。一定要使用大的負數(shù),如 -1000(略多于一天),以避免服務器和瀏覽器時鐘之間的不匹配。第二個屬性 Response.ExpiresAbsolute 將使您設置內(nèi)容過期的具體時間:

<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>


您可以不使用 Response 對象設置過期時間,而將 <META> 標記寫進 HTML,通常寫在 HTML 文件的 <HEAD> 部分。一些瀏覽器將遵照此指令,而代理則不然。

<META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15">


最后,您可以使用 Response.CacheControl 屬性,指示其內(nèi)容是否可以讓 HTTP 代理緩存。若將此屬性設置為“Public”,代理就可以緩存此內(nèi)容。

<% Response.CacheControl = "Public" %>


在默認情況下,此屬性被設置為“Private”。注意,對于顯示某用戶特定數(shù)據(jù)的頁面,不應啟用代理緩存,因為代理可能給用戶提供屬于其他用戶的頁面。

技巧 22:盡可能使用 Server.Transfer 代替 Response.Redirect
Response.Redirect 讓瀏覽器請求另一個頁面。此函數(shù)常用來將用戶重定向到一個登錄或錯誤頁面。因為重定向強制請求新頁面,結(jié)果是瀏覽器必須到 Web 服務器往返兩次,且 Web 服務器必須多處理一個請求。IIS 5.0 引入了一個新的函數(shù) Server.Transfer,它將執(zhí)行轉(zhuǎn)移到同一臺服務器上的另一個 ASP 頁。這樣就避免多余的瀏覽器-Web-服務器的往返,從而改善了總體系統(tǒng)性能以及縮短了用戶的響應時間。檢查“重定向”中的“新的方向”,上面應該是 Server.Transfer 和 Server.Execute。

另請參見 Leveraging ASP in IIS 5.0,了解 IIS 5.0 和 ASP 3.0 新功能的完整列表。

技巧 23:在目錄 URL 中使用后斜杠
一個相關的技巧是確保在指向目錄的 URL 中使用后斜杠 (/)。如果您省略了后斜杠,瀏覽器就會向服務器發(fā)出請求,只是為了告訴服務器,它在請求目錄。瀏覽器就會發(fā)出第二個請求,將斜杠附加到 URL 后面,只有此后,服務器才能以該目錄的默認文檔或目錄列表(如果沒有默認文檔且啟用了目錄瀏覽的話)響應。附加斜杠可省去第一個、無用的住返。為便于用戶閱讀,可以省略顯示名稱中的后斜杠。

例如,寫:

<a href="http://msdn.microsoft.com/workshop/"; title="MSDN Web
Workshop">http://msdn.microsoft.com/workshop<;/a>


這也適用于指向 Web 站點上主頁的 URL:使用下面的:<a href="http://msdn.microsoft.com/";>,而不使用 <a href="http://msdn.microsoft.com";>。

技巧 24:避免使用服務器變量
訪問服務器變量會使 Web 站點向服務器發(fā)出一個特殊請求,并收集所有服務器變量,而不只是您請求的那個變量。這種情況類似于,在發(fā)霉的閣樓上,在一個文件夾中查找某個文件。當您想要找那個文件時,您必須去閣樓上,先找到文件夾,然后才能找到這份文件。當您請求服務器變量時,發(fā)生的情況是一樣的 - 您第一次請求服務器變量時,就會使性能受到影響。后面的對其它服務器變量的請求,則不會對性能產(chǎn)生影響。

決不要訪問非限定的 Request 對象(例如,Request("Data"))。對于不在 Request.Cookies、Request.Form、Request.QueryString 或 Request.ClientCertificate 中的項目,則隱式調(diào)用 Request.ServerVariables。Request.ServerVariables 集合比其它集合慢得多。

技巧 25:升級到最新和最出色的
系統(tǒng)組件是恒定的,我們建議您將它們升級到最新和最好的配置。最好升級到 Windows 2000(因此,也應升級到 IIS 5.0、ADO 2.5、MSXML 2.5、Internet Explorer 5.0、VBScript 5.1 和 JScript 5.1)。在多處理器計算機上,實施 IIS 5.0 和 ADO 2.5 可顯著改善性能。在 Windows 2000 下,ASP 可以很好地擴展到四個處理器或更多,而在 IIS 4.0 下,ASP 的擴展性不能超出兩個處理器。在應用程序中使用的腳本代碼和 ADO 越多,升級到 Windows 2000 之后,性能的改善就會越多。

如果目前還不能升級到 Windows 2000,您可以升級到 SQL Server、ADO、VBScript 和 JScript、MSXML、Internet Explorer 和 NT 4 Service Packs 的最新版本。它們均可提高性能和可靠性。

技巧 26:優(yōu)化 Web 服務器
有多種 IIS 優(yōu)化參數(shù)可以改善站點性能。例如,對于 IIS 4.0,我們常常發(fā)現(xiàn),增加 ASP ProcessorThreadMax 參數(shù)(參見 IIS 文檔)可以顯著改善性能,特別是在傾向于等待后端資源(如數(shù)據(jù)庫)或其它中間產(chǎn)品(如屏幕刷)的站點上。在 IIS 5.0 中,您可能發(fā)現(xiàn)啟用 ASP Thread Gating 比查找一個 AspProcessorThreadMax 最佳設置效率更高,這一點現(xiàn)在已為大家所熟知。

有關較好的參考資料,參見下面的優(yōu)化 IIS。

最佳的配置設置取決于(其中一些因素)應用程序代碼、運行所在的系統(tǒng)硬件和客戶機工作負荷。找到最佳設置的唯一方法是進行性能測試,這是我們在下一個技巧中所要討論的。

技巧 27:進行性能測試
正如我們在前面已經(jīng)講過,性能是一個特征。如果您想要改善站點的性能,那么就制定一個性能目標,然后逐步改進,直到達到目標為止。不要,就不進行任何性能測試。通常,在項目結(jié)束時,再作必需的結(jié)構(gòu)調(diào)整已經(jīng)為時太晚,您的客戶將為此感到失望。將性能測試作為您日常測試的一部分來進行。可以對單個組件分別進行性能測試,如針對 ASP 頁或 COM 對象,或?qū)⒄军c作為一個整體來測試。

許多人使用單個瀏覽器請求頁面,來測試 Web 站點的性能。這樣做就會給您一個感覺,即站點的響應能力很好,但這樣做實際上并不能告訴您在負載條件下站點的性能如何。

一般情況下,要想準確地測試性能,您需要一個專門的測試環(huán)境。此環(huán)境應包括硬件,其處理器速度、處理器數(shù)量、內(nèi)存、磁盤、網(wǎng)絡配置等方面與生產(chǎn)環(huán)境的硬件相似。其次,您必須指定客戶機的工作負荷:有多少同時的用戶,他們發(fā)出請求的頻率,他們點擊頁面的類型等等。如果您沒有站點實際使用情況的數(shù)據(jù),您必須估計一下使用的情況。最后,您需要一個可以模擬預期客戶機工作負荷的工具。有了這些工具,您就可以開始回答諸如“如果我有 N 個同時的用戶,那么需要多少服務器?”之類的問題。您還可以找出出現(xiàn)瓶頸的原因,并以此為目標進行優(yōu)化。

下面列出了一些好的 Web 負載測試工具。我們特別推薦 Microsoft Web Application Stress (WAS) 工具包。WAS 可使您記錄測試腳本,然后模擬數(shù)百或成千上萬個用戶訪問 Web 服務器。WAS 報告很多統(tǒng)計信息,包括每秒鐘的請求數(shù),響應時間分布情況和錯誤計數(shù)。WAS 有豐富的客戶機界面和基于 Web 的界面兩種,Web 界面可使您進行遠程測試。

一定要閱讀 IIS 5.0 Tuning Guide。

技巧 28:閱讀資源鏈接
下面是一些與性能有關的出色的資源鏈接。如果您想了解有關信息,請閱讀 Developing Scalable Web Applications。

資源
優(yōu)化 ASP 腳本

優(yōu)化 IIS

ADO 和 SQL Server


ASP 組件和線程模型

詞典組件

會話狀態(tài)


性能和可擴展性

工具

書目


ASP Web 站點

ASP 樣式

XML



優(yōu)化 ASP 腳本
Developing Scalable Web Applications

Got Any Cache" Nancy Winnick Cluts 著

Maximizing the Performance of Your Active Server Pages,Nancy Winnick Cluts 著

15 Seconds: Performance Section

Enhancing Performance in ASP - Part I,Wayne Plourde 著

When is Better Worse" Weighing the Technology Trade-Offs,Nancy Winnick Cluts 著

Speed and Optimization Resources,Charles Carroll 著

優(yōu)化 IIS
The Art and Science of Web Server Tuning with Internet Information Services 5.0

Leveraging ASP in IIS 5.0,J.D. Meier 著

Tuning IIS 4.0 for High Volume Sites,Michael Stephenson 著

Tuning Internet Information Server Performance,Mike Moore 著

Navigating the Maze of Settings for Web Server Performance Optimization,Todd Wanke 著

Managing Internet Information Server 4.0 for Performance,Hans Hugli 著

ADO 和 SQL Server
Top Ten Tips: Accessing SQL Through ADO and ASP,J.D. Meier 著

Improve the Performance of your MDAC Application,Suresh Kannan 著

Pooling in the Microsoft Data Access Components,Leland Ahlbeck 和 Don Willits 合著

SQL Server: Performance Benchmarks and Guides

Improving the Performance of Data Access Components with IIS 4.0,Leland Ahlbeck 著

Microsoft Data Access Components (MDAC) and ActiveX Data Objects (ADO) Performance Tips,Leland Ahlbeck 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Server Perspective,Damien Lindauer 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Application Perspective,Damien Lindauer 著

Accessing Recordsets over the Internet,Dino Esposito 著

ASP 組件和線程模型
ASP Component Guidelines,J.D. Meier 著

Q243548: INFO: Design Guidelines for VB Components under ASP

Threading Models Explained,Nancy Winnick Cluts 著

So Happy Together" Using ActiveX components with Active Server Pages,Nancy Winnick Cluts 著

Developing Active Server Components with ATL,George Reilly 著

Agility in Server Components,Neil Allain 著

Building High-Performance Middle-Tier Components with C++,Jon Flanders 著

Active Server Pages and COM Apartments,Don Box 著

House of COM: Active Server Pages,Don Box 著

House of COM: Contexts,Don Box 著

House of COM: Performance Trade-offs of the Windows 2000 Component Execution Environment,Don Box 著

Building COM Components That Take Full Advantage of Visual Basic and Scripting,Ivo Salmre 著

Component Design Principles for MTS

詞典組件
Creating a Page Cache Object,Robert Coleridge 著

Abridging the Dictionary Object: The ASP Team Creates a Lookup-Table Object,Robert Carter 著

Caprock Dictionary

Site Server Commerce Edition includes a dictionary component

會話狀態(tài)
Q175167: HOWTO: Persisting Values Without Sessions

Q157906: HOWTO: How To Maintain State Across Pages with VBScript

XML-based Persistence Behaviors Fix Web Farm Headaches,Aaron Skonnard 著

House of COM: Stateless Programming,Don Box 著

性能和擴展性
Blueprint for Building Web Sites Using the Microsoft Windows DNA Platform

Server Performance and Scalability Killers,George Reilly 著

Microsoft Visual Studio Scalability Center

Fitch & Mather Stocks 2000

Tuning the FMStocks Application

High-Performance Visual Basic Apps,Ken Spencer 著

Duwamish Books,Phase 4

Top Windows DNA Performance Mistakes and How to Prevent Them,Gary Geiger 和 Jon Pulsipher 合著

Building from Static HTML to High-Performance Web-Farms,Shawn Bice 著

工具
Microsoft Web Application Stress Tool

I Can't Stress It Enough -- Load Test Your ASP Application,J.D. Meier 著

Windows DNA Performance Kit

Monitoring Events in Distributed Applications Using Visual Studio Analyzer,Mai-lan Tomsen 著

書目
Professional Active Server Pages 3.0,Wrox Press(特別是第 26 章:Optimizing ASP Performance,George Reilly 和 Matthew Gibbs 合著)。

Microsoft Internet Information Services 5.0 Resource Guide(與 Windows 2000 Server Resource Kit 在一起),Microsoft Press。

Microsoft Internet Information Server Resource Kit(用于 IIS 4.0),Microsoft Press。

Programming Distributed Applications with COM and Microsoft Visual Basic 6.0,Ted Pattison 著,Microsoft Press。

Effective COM,Don Box、Keith Brown、Tim Ewald 和 Chris Sells 合著;Addison-Wesley。

Developing Web Usability: The Practice of Simplicity,Jakob Nielsen 著,New Riders。

ASP Web 站點
Microsoft TechNet for IIS

LearnASP.com

4GuysFromRolla.com

15Seconds.com

AspToday.com

Asp101.com

AspLists.com。許多專業(yè)的郵件列表包括:

Fast Code!
ASP Advanced
Not NewbieState Management
Scalability
Visual Basic Components
XML
C++/ATL Component Building
UseIt.com: Web 可用性

ASP 樣式
ASP Best Practices,George Reilly 著

ASP Quick Lessons,Charles Carroll 著

Planning for ASP,John Meade 著

ASP Guidelines,J.D. Meier 著

XML
Inside XML Performance,Chris Lovett 著

Inside MSXML3 Performance,Chris Lovett 著

轉(zhuǎn)載于:https://www.cnblogs.com/swordzj/archive/2005/02/28/2034810.html

總結(jié)

以上是生活随笔為你收集整理的微软建议的ASP性能优化28条守则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久久免费网站 | av亚洲产国偷v产偷v自拍小说 | 欧美中文字幕久久 | 久久综合给合久久狠狠色 | 五月激情六月丁香 | 亚洲天堂社区 | 成人午夜电影在线 | 欧美日韩在线免费观看视频 | 97电影手机 | 日韩精品久久久久久 | 久久精品99国产精品 | 日韩xxxx视频 | 欧美一二区视频 | 深夜男人影院 | 中文字幕 在线看 | 美女黄久久 | 日韩精品2区 | 中文字幕av免费在线观看 | 国产99久久久国产精品 | 天天干天天射天天操 | 在线视频app | 欧美视频xxx | 91丨九色丨蝌蚪丨老版 | 亚洲春色综合另类校园电影 | 日韩动漫免费观看高清完整版在线观看 | 成人免费网站在线观看 | 一区二区电影在线观看 | 国产精品久久久久久久久久久久久久 | 日日夜夜精品 | 蜜桃av久久久亚洲精品 | 日韩特级黄色片 | 日韩在线视频线视频免费网站 | 91亚洲网 | 黄色一级片视频 | 国产主播大尺度精品福利免费 | 色小说av| 色网站在线免费观看 | 国产黄色一级片在线 | 日韩精品视频免费在线观看 | 成年美女黄网站色大片免费看 | 九九色综合 | 亚洲一区 av | 日韩成人在线免费观看 | 91麻豆看国产在线紧急地址 | 精品一二三四在线 | 一区二区观看 | 国产精品每日更新 | 懂色av一区二区三区蜜臀 | 色在线网| 一本一本久久a久久精品综合妖精 | 国产特级毛片aaaaaa高清 | av不卡中文字幕 | 国产高清一 | 夜夜摸夜夜爽 | 日p视频在线观看 | 国内精品久久久久久 | 人人看97 | 国产99久久久国产 | 91九色国产 | 天天操夜夜操天天射 | 99国内精品| 91大神电影 | 亚洲黄色小说网址 | 91秒拍国产福利一区 | 人成在线免费视频 | www免费看| 欧美一区二区三区在线观看 | 热久久这里只有精品 | 国产成人精品一区二区三区在线观看 | 免费在线播放av电影 | 国产女人18毛片水真多18精品 | 91日韩在线播放 | 国产成人精品午夜在线播放 | 中文字幕亚洲情99在线 | 精品国产中文字幕 | 丝袜+亚洲+另类+欧美+变态 | 精品一区久久 | 麻豆一区二区 | 久久精品www人人爽人人 | 99热手机在线 | 97在线观看免费观看高清 | 狠狠久久综合 | 免费在线播放黄色 | 天天色天天搞 | 国产99免费 | 色香网 | av线上免费看 | 国产一二三四在线观看视频 | 亚洲日本va在线观看 | 日日操网站 | 免费视频一二三区 | 丰满少妇在线观看 | 综合久久影院 | 99热这里精品 | 九九在线高清精品视频 | 色婷婷狠狠五月综合天色拍 | 在线免费黄色毛片 | 国产精品系列在线播放 | 久久婷婷一区二区三区 | 丁香久久五月 | 成人污视频在线观看 | 精品在线一区二区三区 | 激情视频免费观看 | 久草新在线 | 天堂网在线视频 | 欧美视屏一区二区 | 色综合久久99| 五月婷激情| 国产视频一区二区在线观看 | a级片在线播放 | 久久人人爽爽人人爽人人片av | 精品国产成人在线影院 | 美女在线免费观看视频 | 亚洲国内精品 | 国产精品麻豆一区二区三区 | 一区二精品 | 亚洲欧美国产精品 | 成人免费视频网址 | 日韩av网址在线 | 国产色综合天天综合网 | 一区二区三区四区在线 | 丁香视频全集免费观看 | 99久久精品国产网站 | 超黄视频网站 | 日韩精品无 | 国产亚洲一区二区在线观看 | 欧美久久影院 | 日韩欧美在线综合网 | 亚洲精品国精品久久99热 | 国产理论片在线观看 | 国产一级二级三级在线观看 | 国产精品成人av在线 | 日本中文字幕高清 | av性网站| 国产精品久久三 | 99福利影院| 国产高清在线a视频大全 | 国产一区二区免费在线观看 | 久久精品电影网 | 涩涩网站在线看 | 高清av免费一区中文字幕 | 色www免费视频 | 欧美黑人xxxx猛性大交 | 在线中文字幕视频 | 深爱婷婷网| 久久久精品视频成人 | 在线精品在线 | 天堂在线v | 2024国产精品视频 | 色婷婷色 | 精品视频在线播放 | 日韩在线视频国产 | 日韩精品视频在线观看免费 | 免费观看91 | 亚洲 欧美 91 | 免费看成人av | 丁香六月激情婷婷 | 欧美日韩在线电影 | av网址aaa| av免费试看 | 99久久精品午夜一区二区小说 | 午夜久久网 | 一区二区精品视频 | 成人a视频在线观看 | 五月婷婷激情 | 亚洲精品在线视频 | 婷婷香蕉| 香蕉视频在线视频 | 在线精品视频免费播放 | 99精彩视频在线观看免费 | 欧美精品在线一区二区 | 波多野结衣视频一区二区三区 | 男女视频国产 | 国产成人久久久77777 | 久久视讯| 亚洲欧美日韩国产一区二区 | 久久久国产精品一区二区三区 | 激情五月婷婷综合网 | 在线观看一区二区精品 | 91精品国自产在线观看欧美 | 人人看人人做人人澡 | 色狠狠狠 | 99热这里只有精品国产首页 | 天无日天天操天天干 | 精品国产网址 | 激情网站免费观看 | 国产一级片直播 | 国产精品精品国产色婷婷 | 久久99最新地址 | 亚洲aaa毛片 | 欧美日韩性视频在线 | www黄色大片 | 色资源网免费观看视频 | 久久久www成人免费精品 | 91精品国产入口 | 视频一区二区在线 | 久久成人精品电影 | 久久天| 欧美日韩国产mv | 欧美日韩在线免费视频 | 婷婷国产视频 | 成人av在线亚洲 | 99re热精品视频 | 91成人免费看片 | 成人小视频在线观看免费 | 亚洲区另类春色综合小说校园片 | 黄色在线观看免费 | 欧美激情精品久久久久久免费 | 国产老太婆免费交性大片 | 国产精品视频资源 | 99精品久久久久 | 精品国产123 | 亚洲欧美日韩精品久久奇米一区 | 九色激情网| 欧美日韩免费看 | 国产精品九九视频 | 69亚洲精品 | 美女视频黄免费的 | www.亚洲视频.com | 欧美a级片免费看 | 久久久精品网 | 亚洲九九九 | 日韩一级片大全 | 天天综合久久 | 超碰人人超 | 精品在线观看一区二区 | 91精品视频一区 | 免费观看性生活大片 | 在线天堂中文在线资源网 | 精品久久五月天 | www.亚洲精品在线 | 国产午夜精品久久 | 国产精品成人一区二区三区吃奶 | 日韩三级视频在线看 | 国产玖玖精品视频 | 91福利视频免费 | 免费观看性生活大片3 | 一区二区三区四区精品 | 一区二区 久久 | 天天操天天爱天天爽 | 中文字幕日韩高清 | av成人免费观看 | 美女视频久久黄 | 免费看成人a | 国产片网站 | 2023年中文无字幕文字 | av一区二区在线观看中文字幕 | 日本三级人妇 | 一区二区视频欧美 | 日韩精品在线视频免费观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久久综合狠狠狠色97 | 欧美日韩破处 | 亚洲成人av一区 | 制服丝袜在线91 | 国际精品久久久 | 狠狠色伊人亚洲综合成人 | 精品麻豆 | 五月婷婷丁香激情 | 国产精品一区二区三区在线免费观看 | 在线观看免费版高清版 | 欧美另类老妇 | 麻豆传媒视频在线免费观看 | 成 人 黄 色视频免费播放 | 国产一线天在线观看 | 国产日韩欧美视频 | 欧美日韩在线电影 | 国产福利av | 99精品久久只有精品 | 美女网站黄在线观看 | 久久久久久国产精品久久 | 天天艹天天操 | 久草亚洲视频 | 特级毛片aaa | 欧美黄色成人 | 高清有码中文字幕 | ww视频在线观看 | 色综合激情久久 | 五月婷婷久 | 成人在线观看资源 | 亚洲精品在线观看的 | 亚洲国产欧美在线看片xxoo | 亚洲综合欧美日韩狠狠色 | 香蕉手机在线 | 亚洲国产午夜 | 亚洲一区二区天堂 | 欧美中文字幕久久 | 欧洲精品久久久久毛片完整版 | 欧美精品免费在线观看 | 91av在线播放 | 91精品国产99久久久久久红楼 | 久久精品视频在线看 | 国产在线播放不卡 | 亚洲精品乱码久久久久久久久久 | 久久乐九色婷婷综合色狠狠182 | 久久精品一区二区三区四区 | 久久精品综合网 | 久久久九色精品国产一区二区三区 | 激情五月综合网 | 日韩欧美网址 | 91尤物国产尤物福利在线播放 | 天天干,天天射,天天操,天天摸 | 在线看片成人 | 国产美女精品视频 | 午夜少妇 | 91精品视频免费 | 18久久久 | 久草五月 | 超碰av免费 | 99精品视频在线看 | 人人干在线| 人人看人人爱 | 在线免费观看的av网站 | 亚洲午夜久久久综合37日本 | 婷婷丁香色综合狠狠色 | 亚洲精品动漫成人3d无尽在线 | 视频1区2区 | 久久精品首页 | 国产午夜在线观看 | 中文字幕在线观看免费观看 | 色香天天 | 天天综合色 | 婷婷久草| 91理论片午午伦夜理片久久 | 九色琪琪久久综合网天天 | 91免费国产在线观看 | 亚洲欧美成人 | 中文字幕在线视频网站 | 亚洲视频www | 伊人电影天堂 | 天天干夜夜干 | 在线91av | 少妇bbb好爽| 久久久精华网 | 久久成人在线 | 黄色免费观看网址 | 中文字幕色在线 | 亚洲影院国产 | 久久国产女人 | 久久精品视频99 | 91av影视 | 免费看的黄色的网站 | 在线黄色免费 | 久久国产电影院 | 国产精品久久在线 | 成人久久国产 | 欧美日韩一二三四区 | 一区二区日韩av | 97超碰免费在线观看 | 最新国产精品拍自在线播放 | 综合铜03 | 亚洲婷婷在线视频 | 亚洲欧洲一区二区在线观看 | 国产91精品久久久久 | 天天操天天操天天爽 | 成人在线电影观看 | 少妇搡bbbb搡bbb搡忠贞 | 国产97av | 免费在线观看av的网站 | 国产成视频在线观看 | 天天干天天操av | 亚洲精品美女 | 日韩电影在线观看一区二区三区 | 免费观看一区二区三区视频 | 久久影院一区 | 国产亚洲一级高清 | 欧美日韩国产高清视频 | 麻豆视频免费入口 | 一级黄视频 | 国产中文字幕视频 | 在线成人中文字幕 | 免费观看午夜视频 | 欧美久久久久久久久中文字幕 | 在线看片91 | 久久国产精品99久久人人澡 | 91精品在线播放 | 免费看片色 | 97人人爽人人 | 99久久一区 | 国语黄色片 | 超碰99人人 | 日韩v欧美v日本v亚洲v国产v | 国产黑丝一区二区三区 | 高清不卡一区二区在线 | 亚洲精品在 | 人人爽网站 | 亚洲人人网 | 99精品一区二区三区 | 少妇性bbb搡bbb爽爽爽欧美 | 久久av在线播放 | 欧美国产不卡 | 国产专区日韩专区 | 中文字幕在线观看资源 | 国产婷婷视频在线 | 亚洲视频在线视频 | 国产精品久久99综合免费观看尤物 | 久久99国产精品免费网站 | 岛国av在线免费 | 园产精品久久久久久久7电影 | 干干操操 | 91九色在线 | 99精品视频在线播放观看 | 天天色天天色 | 国产精品v a免费视频 | 国产高清在线免费观看 | 精品字幕在线 | 国产爽视频 | 成人在线视频免费看 | 欧美天天干 | 精品一区精品二区 | 国产精品中文在线 | 美女免费视频一区二区 | 久久国产美女视频 | 久久久久亚洲精品成人网小说 | 成人资源在线观看 | 久久影院中文字幕 | 欧美精品一区二区在线播放 | 操老逼免费视频 | 一区免费视频 | 深夜免费福利视频 | 在线看日韩 | 99久久精品费精品 | 精品av在线播放 | 国产九九精品视频 | 九九热精品在线 | 欧美福利精品 | 国产精品乱码久久久 | 综合在线色 | 国产拍在线 | 最新国产精品视频 | 国产一区视频在线观看免费 | 色网站在线免费 | 久久区二区 | 日韩二区三区在线 | 99国产在线观看 | 亚洲精品一区二区三区高潮 | 天天天干夜夜夜操 | 国产免费叼嘿网站免费 | 中文 一区二区 | 黄色免费观看视频 | 国产精品高潮呻吟久久av无 | 欧美一级久久久久 | 午夜av电影 | 国精产品999国精产品视频 | 97香蕉超级碰碰久久免费软件 | 久久久精品二区 | 久久婷婷国产 | 成人久久久久久久久久 | 在线一区电影 | 黄色午夜 | 91九色在线视频观看 | 中文av不卡 | 久久精品一二三区 | 久久一视频 | 久久www免费视频 | 正在播放五月婷婷狠狠干 | 欧美激情精品一区 | 亚洲三级在线免费观看 | av丁香| 国产精品中文字幕在线观看 | 97视频入口免费观看 | 国产精品专区在线观看 | 天天色天天爱天天射综合 | 亚洲欧洲成人 | 久艹在线免费观看 | 九九综合久久 | 亚洲午夜av| 综合国产在线观看 | 免费合欢视频成人app | 天天干天天射天天爽 | 国产又粗又长又硬免费视频 | 天天综合色网 | 国产在线 一区二区三区 | 午夜天天操 | 丁香久久婷婷 | 中文字幕免费观看全部电影 | 日本韩国精品在线 | 日韩极品视频在线观看 | 国产91在线观看 | 正在播放国产精品 | 精品主播网红福利资源观看 | 亚洲高清视频一区二区三区 | 国产精品视频大全 | 在线视频国产区 | 国产精品黄色在线观看 | 在线观看免费av片 | 天天干天天干天天射 | 日韩中文在线观看 | 在线观看国产成人av片 | 色婷婷激情电影 | 国产成人精品国内自产拍免费看 | 国产不卡在线观看 | 国产亚洲精品日韩在线tv黄 | 久草国产在线观看 | 西西大胆啪啪 | 亚洲国产成人精品久久 | 中文字幕色网站 | 黄色亚洲在线 | 婷婷av综合 | 国产91对白在线播 | 91视频 - x99av | 丁香5月婷婷 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 九九视频这里只有精品 | 欧美日韩国产精品一区二区三区 | 日韩中文在线电影 | 国产精品99久久免费观看 | 亚洲精品视频在线 | 日韩成人在线免费观看 | 国产爽妇网 | 婷婷九月丁香 | 国色综合 | 91精品久久久久久 | 在线涩涩| 91视频亚洲| 中文字幕免费高清 | 一区二区三区在线观看 | 久久久久久影视 | 中文字幕在线免费看线人 | 丝袜美腿一区 | 色婷婷综合久色 | 色哟哟国产精品 | 日本不卡一区二区三区在线观看 | 亚洲最新av在线网站 | 亚洲成人免费在线观看 | 国产精品国产三级国产aⅴ9色 | 国产区精品 | 伊人国产在线观看 | 中文字幕日本在线观看 | 91人人爱| 一区二区三区国产欧美 | 久久99精品久久久久久秒播蜜臀 | 日韩精品aaa | 日韩精品 在线视频 | 一级一级一片免费 | 视频一区二区国产 | 国产资源免费在线观看 | 日韩va在线观看 | www.五月婷婷 | 91精品少妇偷拍99 | 一级免费黄视频 | 香蕉在线影院 | 精品久久久久亚洲 | 日韩激情一二三区 | 91秒拍国产福利一区 | 看污网站 | 尤物一区二区三区 | 免费黄在线看 | 日韩在线网址 | 久久免费看| 国内精品视频久久 | 久久人人爽人人片av | 日韩精品最新在线观看 | 色丁香色婷婷 | 欧洲精品一区二区 | 亚洲国产精品成人va在线观看 | www.99热精品 | 精品国产一区二区三区四区vr | 一区二三国产 | 成av在线 | 久草免费在线观看 | 在线91网 | 欧美 日韩 国产 中文字幕 | 色婷婷激情五月 | 久久尤物电影视频在线观看 | 一区二区三区电影在线播 | 国产精品 亚洲精品 | 91九色最新地址 | 日韩aa视频| 手机在线欧美 | 久久97精品 | 香蕉网在线观看 | 久久婷婷视频 | 一区二区三区日韩在线观看 | 91tv国产成人福利 | 亚洲国产欧美在线人成大黄瓜 | 亚洲激情网站免费观看 | 免费在线观看av网站 | 国产精品一区二区三区电影 | 色婷婷 亚洲 | 久久99国产精品久久99 | 全黄网站| 日韩在线播放视频 | 国产一级片视频 | 波多野结衣在线视频免费观看 | 天天天天色综合 | 国产成人精品一区二区在线观看 | 久草免费在线观看 | 免费看片日韩 | 97热在线观看 | 草久在线播放 | 波多野结衣久久资源 | .国产精品成人自产拍在线观看6 | 欧美老女人xx | 欧美老女人xx | 青青久草在线视频 | 日日干综合 | av在线在线 | 成人97视频一区二区 | 国产精品久久久久av福利动漫 | 五月花激情 | 中文字幕在线成人 | 日韩免费视频线观看 | 国产精品激情在线观看 | 九九爱免费视频 | 奇米影视8888在线观看大全免费 | 视频国产精品 | 国产一区二区电影在线观看 | 成年美女黄网站色大片免费看 | 九九久久免费视频 | 热99在线视频 | 免费在线一区二区 | 日韩在线免费高清视频 | 在线亚洲精品 | 韩日电影在线观看 | 狠狠艹夜夜干 | 国内精品视频免费 | 国产资源在线视频 | 国产精品视频app | 国产亚洲激情视频在线 | 国产精品va | 三级黄色网址 | 亚洲视屏 | 婷婷色网址 | 精品国产123 | 91九色蝌蚪视频网站 | 国产精品乱码久久久久 | 日韩精品不卡 | 在线观看aa | 日韩中文免费视频 | 91免费看黄色 | 午夜久久电影网 | 天天干天天干天天干天天干天天干天天干 | 日韩欧美精品一区二区三区经典 | 欧美一区二区三区激情视频 | 日韩电影中文字幕 | 中文字幕精品三区 | 去干成人网 | 91.麻豆视频| 国产视频在线观看一区 | 欧美日韩视频在线一区 | 欧美黑人猛交 | 九九久久成人 | 波多野结衣视频在线 | 江苏妇搡bbbb搡bbbb | 97免费在线观看视频 | 美女久久久久久久久久 | 国产91丝袜在线播放动漫 | 欧美激情精品久久久久久免费印度 | 久久久免费少妇 | 丁香综合 | 又爽又黄又无遮挡网站动态图 | 欧美激情精品久久久久久免费 | 国产欧美日韩视频 | 亚洲精品一区二区三区在线观看 | 在线观看日本韩国电影 | 国产 视频 高清 免费 | 国产精品久久人 | 深夜免费网站 | 在线观看小视频 | www黄色com | 久久久久免费电影 | www亚洲一区 | 91视频免费观看 | 成人三级网站在线观看 | 日韩av免费在线看 | 国产欧美精品一区二区三区 | av成人在线网站 | av在线之家电影网站 | 国产福利免费看 | 免费看一及片 | 欧美性爽爽 | 九九九热精品免费视频观看网站 | 国产精品第2页 | 国产破处在线播放 | 小草av在线播放 | av三级av | 欧美性极品xxxx做受 | 久久亚洲欧美日韩精品专区 | 日韩精品欧美视频 | 婷婷丁香导航 | 精品毛片一区二区免费看 | 国产精品理论片 | 国产在线观看一 | 亚洲精品美女久久久久 | 日韩二区三区在线观看 | 亚洲激情国产精品 | 中文字幕在线日 | 中文字幕在线观看完整版 | 精品一二三区 | 国产精品视频在线观看 | 精品国产黄色片 | 色综合久久久久综合体 | 久草在| 91色吧 | 中文字幕在线观看国产 | 欧美中文字幕第一页 | 正在播放亚洲精品 | 亚洲永久精品视频 | 亚洲三级黄 | 精品色综合 | 日韩www在线 | 日本少妇视频 | 久久99精品久久久久婷婷 | 久久久久久久国产精品视频 | 中文字幕在线看视频国产中文版 | 中文字幕在线视频国产 | 日韩视频一区二区在线观看 | 欧美巨大荫蒂茸毛毛人妖 | 一级精品视频在线观看宜春院 | 国产精品女人网站 | a天堂最新版中文在线地址 久久99久久精品国产 | 综合亚洲视频 | 亚洲精品国产精品99久久 | 亚洲国产片色 | 永久中文字幕 | 国产精品视频免费看 | 亚洲日本va在线观看 | 97自拍超碰| 婷婷在线视频 | 久久久精品国产免费观看同学 | 午夜男人影院 | 国产精品久久久视频 | 国产精品久久99综合免费观看尤物 | 午夜精品久久久久久久久久 | 久久婷亚洲五月一区天天躁 | 99在线热播精品免费99热 | 久久久久久久久毛片精品 | 最近免费中文字幕 | 亚洲欧美国产视频 | 国产一区二区三区网站 | 99爱爱| 成人免费在线播放视频 | 久久精品99国产 | 国产精品1区2区在线观看 | 嫩草伊人久久精品少妇av | 国产在线色| 久久天堂网站 | 99精品欧美一区二区 | 国产精品国产亚洲精品看不卡15 | 国产偷在线 | 国产高清不卡在线 | 在线国产精品视频 | 99爱爱| 成人av动漫在线 | 日本久久99| 韩国av在线播放 | 狠狠干夜夜爽 | 天天操天天拍 | 国产一区在线观看视频 | 国产精品视频观看 | 国产大片免费久久 | 亚洲三级视频 | 中文字幕日韩国产 | 91麻豆看国产在线紧急地址 | 天天插天天干 | 探花视频在线观看 | 特及黄色片 | 日韩免费在线观看视频 | 国产一区在线免费观看视频 | 丁香婷婷电影 | 91精品国产入口 | 色综合婷婷久久 | 日韩免费看的电影 | 日韩av成人| 中文字幕黄色网址 | 在线观看你懂的网址 | 久久精品久久国产 | 日日爱av| 久草成人在线 | av免费观看在线 | 91在线资源 | 天天操天天干天天玩 | 亚洲国产成人高清精品 | 日本字幕网 | 国产精品 日本 | 欧美日韩p片 | 欧美精品一级视频 | 久久国产精品影片 | 国产精品一级视频 | 欧美一级裸体视频 | 色综合人人 | 毛片一二区 | 亚洲欧美在线观看视频 | av高清网站在线观看 | av导航福利 | 色综合久久精品 | 午夜视频免费在线观看 | av国产网站 | 特黄特色特刺激视频免费播放 | 国产成人免费精品 | 国产精品久久久久久久7电影 | 亚洲精品福利在线观看 | 狠狠躁天天躁综合网 | 97免费在线观看视频 | 国内精品二区 | 色婷婷色 | 日韩综合视频在线观看 | 99视频在线精品免费观看2 | 日韩av免费观看网站 | 99精品国产免费久久久久久下载 | 久草在线最新视频 | 国产一级二级在线播放 | 中文理论片 | 超碰在线人人艹 | 黄色一级免费 | 亚洲一级免费电影 | 亚洲第一久久久 | 18国产精品白浆在线观看免费 | 又湿又紧又大又爽a视频国产 | 99国产精品一区二区 | 欧美日韩性生活 | 91成人短视频在线观看 | 91一区在线观看 | 欧美另类高清 videos | 国产永久免费高清在线观看视频 | 国产久草在线 | 欧美成人精品三级在线观看播放 | 亚洲九九 | 亚洲精品www久久久久久 | 9幺看片 | 香蕉视频18 | 国产高清精品在线观看 | 深爱激情开心 | 岛国大片免费视频 | 日韩精品电影在线播放 | 久久综合精品国产一区二区三区 | 亚洲精品免费在线观看视频 | 亚洲精品国产第一综合99久久 | 国产又黄又爽无遮挡 | 日韩a在线| 日韩精品视频免费 | 在线播放国产一区二区三区 | 日本精品va在线观看 | 久草在线手机视频 | 亚洲精品国精品久久99热一 | 国产 一区二区三区 在线 | 亚洲久草网 | 国产精品完整版 | 欧美性色综合网站 | 天堂视频中文在线 | 国产精品女同一区二区三区久久夜 | 狠狠色婷婷丁香六月 | 亚洲无吗天堂 | 成人av免费看| 精品福利在线观看 | 国产精品mm | 日本性xxxxx 亚洲精品午夜久久久 | 日本三级人妇 | 精品视频在线观看 | a级国产乱理伦片在线观看 亚洲3级 | 人人干免费 | 果冻av在线| 在线视频久 | 91色九色 | 天天骚夜夜操 | 色网站黄| 狠狠操精品 | 欧美日韩国产在线一区 | 成人a级网站 | 射九九 | 国产精品国产三级国产专区53 | 亚洲精品在线观看中文字幕 | 免费看的黄色 | 91丨九色丨丝袜 | 亚洲日本中文字幕在线观看 | 九色激情网 | 国产精品去看片 | 视频二区在线视频 | 精品日韩中文字幕 | 日韩免费一二三区 | 欧美日韩一区二区三区视频 | 久久久久久久久久久久久久av | 182午夜在线观看 | 成人免费在线电影 | 婷婷五月在线视频 | 不卡的av片 | 日韩一级电影网站 | 人人干干人人 | 97国产| 在线免费观看国产视频 | 亚洲va韩国va欧美va精四季 | 麻豆成人小视频 | 精品亚洲在线 | 日韩欧美一区二区三区视频 | 一区二区三区国产精品 | 日韩xxxbbb| 成 人 黄 色 片 在线播放 | www.五月天激情 | 日韩国产欧美在线播放 | 欧美吞精| 中文字幕在线国产 | 久久久精品99 | 中文在线免费一区三区 | 丁香婷婷深情五月亚洲 | 特级西西444www高清大视频 | 亚洲一区二区三区在线看 | 日日夜夜艹 | 天天操天天干天天爽 | 日精品在线观看 | 亚洲成年片 | 日韩精品亚洲专区在线观看 | 日日夜夜免费精品 | 特黄特色特刺激视频免费播放 | 99精品视频网站 | 日韩精品中文字幕在线 | 91色亚洲| 开心丁香婷婷深爱五月 | 国产精品视频免费观看 | 日韩av美女| 久久精品草 | 久久免费播放视频 | 久久人人爽人人爽人人片av软件 | 天天干天天干天天干天天干天天干天天干 | 日韩激情在线 | 久久视频精品在线观看 | 一区二区三区不卡在线 | 四虎在线观看精品视频 | 国产成人一区二区三区在线观看 | 欧美一级免费黄色片 | 91看片在线免费观看 | 天天激情在线 | 在线观看国产麻豆 | 国产成人一二三 | 国产精品完整版 | 精品久久久久久久久久久久久久久久久久 | 69xx视频| 黄色免费网站大全 | 亚洲精品国产精品国自 | 日韩电影中文 | 国产精品久久久免费看 | 中文字幕电影高清在线观看 | 欧美综合在线视频 | 天堂av在线免费观看 | 最近的中文字幕大全免费版 | 九九热精| 日韩中文字幕视频在线观看 | 国产成人区 | 久草精品视频在线看网站免费 | 久久国产女人 | 波多野结衣网址 | 夜色资源站国产www在线视频 | 免费激情网 | 免费黄在线观看 | 国产色视频123区 | 国产精品女人久久久久久 | 日韩免费观看av | 欧美一级黄色视屏 | 午夜黄色一级片 | 亚洲1区 在线 | 精品亚洲视频在线观看 | 国产无遮挡猛进猛出免费软件 | 99久久99热这里只有精品 | 日本中文字幕网 | a级国产乱理论片在线观看 特级毛片在线观看 | 在线涩涩| 天天天在线综合网 | 亚洲精品女人久久久 | 日韩免费在线看 | 狠狠躁夜夜躁人人爽超碰91 | 亚洲综合小说 | 成人动漫精品一区二区 | 精品国产精品一区二区夜夜嗨 | 日韩黄视频 | 久草网站在线 | 黄色国产高清 | av在线之家电影网站 | 欧美日韩在线视频一区 | 日韩在线观 | 亚洲精品国产片 | 免费成人在线观看视频 | 国产精品第72页 | 成人av中文字幕 | 91在线九色 | 国产精品成人一区二区三区吃奶 | 激情综合色图 | 国产高清精品在线观看 | 黄色亚洲大片免费在线观看 | 日韩二区三区在线 | 国产aa免费视频 | 九九日九九操 | 国产精品自拍av | 久久精品国产99国产 | 欧美激情综合五月色丁香小说 | av爱干| 高清美女视频 | 免费午夜在线视频 | 成人一级片视频 | 日韩欧美在线免费 | 日韩精品综合在线 | 精品国产乱码久久久久久三级人 | 午夜美女视频 | 国产最新精品视频 | 人人干,人人爽 | 久久久久 | 日韩av电影免费观看 | 国产精品久久久久久久久久白浆 | 日日操夜|