最近公司一個項目上線後,經常崩潰,於是開始重視性能問題,在網上看到了許多相關文章,整理下發了上來。以備參考。在用ASP.NET開髮網站的時候,性能是永遠需要考慮和關註的問題,性能不僅僅只是程式代碼執行時候的速度,而是涉及到方方面面的東西。就拿ASP.NET的一個請求來講,從瀏覽器向伺服器的ASP.N...
最近公司一個項目上線後,經常崩潰,於是開始重視性能問題,在網上看到了許多相關文章,整理下發了上來。以備參考。
在用ASP.NET開髮網站的時候,性能是永遠需要考慮和關註的問題,性能不僅僅只是程式代碼執行時候的速度,而是涉及到方方面面的東西。
就拿ASP.NET的一個請求來講,從瀏覽器向伺服器的ASP.NET網站發送請求開始一直到最後整個頁面呈現在我們面前,其中請求經過的每一個步驟,都是有不同的調優方式的,而且調用的方法也很多,不僅僅只是常見的:緩存,多線程,非同步等。
本系列的文章決定從兩個大的方面來講述調優:
前臺調優:主要包含如何儘量的減少http請求,從http請求開始,到如何載入js, css,如何壓縮傳輸的數據等。
後臺調優:分析ASP.NET請求的處理過程,併在每一步給出相應的調優方法,而且在代碼組織,架構和資料庫的操作上面給出調優的方法。
記得在剛剛開髮網站的時候,一提到提高性能,最容易也是最快想到的就是緩存,而且在微軟官方的Best Practice的一些文檔中也是建議:層層緩存(在數據存儲層,DAL,BLL,UI等都要緩存)。然後在網站中就”緩存遍地開花”,最後的確實不盡人意。
另外的一個常見的優化針對資料庫的:如儘量減少子查詢,使用join聯接;在常常需要查詢的欄位上面建立索引。確實,這些是很通用,也不錯的一些規則。
而且還有一個體會就是,在優化性能的時候,如果選擇優化代碼和資料庫,往往優化資料庫的一些操作帶來的效果會更加的好,很可惜的是:在項目中(至少在我開發的一些項目中),資料庫僅僅就只是一個數據的存儲設備而已,僅此而已,沒有發揮出資料庫的強大作用。所以還是建議對資料庫的內部查詢和存儲的機制要熟悉,畢竟很多時候開發人員也擔任了DBA的工作(很多公司沒有正式的DBA)。
而且在項目中我們設計資料庫的時候,特別是表欄位的時候,是需要有些考慮的,很多人建議表欄位的長度不要太長,這也是大家常見的建議,但是為什麼?其實,這就需要懂得一些資料庫的內部存儲機制了:在資料庫(SQL SERVER )保存的時候,數據是以”頁”為最小的單位的,每一頁有8K的大小,如果你的一個表中的數據超過8K,那麼這個表的數據就要分幾個頁面保存,這樣在對數據進行查詢的時候,就要跨頁查詢了,跨頁是需要性能消耗的,如果數據都在一個頁面上,那麼速度肯定快些。
所以,要優化網站,就得知道性能消耗在哪裡。
當優化的一個網站的時候,不是盲目的一概而論的,一般來說有兩種情況:
1、網站已經存在了,並且運行了,現在要優化。
2、正在從頭開發一個新的網站。
如果是第一種情況,那麼首先要找出網站性能的瓶頸,從前臺的請求的到後臺的請求處理,一直到最後頁面的呈現,都要一步步的審查。
如果是第二種情況,可能情況就稍微好一點,並且網站現在完全由我們控制,所有在開發和設計的過程中就可以採用很多的優化原則來優化。
優化不一定就是代碼重寫或者做些很大的改動,優化時一點點的累積的,就好比代碼的重構一樣,都是一個積累的效果。比如,是在頁面一開始的時候載入js腳本,還是在整個頁面的最後載入js腳本,有時候往往就只是簡單的調整一下載入的文件,或者非同步的載入腳本,或者通過CDN傳輸腳本等等方法,性能就提升了。性能的提升也不是沒有代價的,有的代價很小,例如只是把腳本的載入放在頁面最後,大的代價就是,例如買些伺服器設備,如Content Delivery Network(CDN)來把靜態的文件(js,css,image)傳送到客戶端。所以說,優化需要權衡策略。
以下是一些javascript與c#交互的常見問題及解決方案
1.如何在javaScript訪問C#函數?
2.如何在Javascript訪問C#變數?
3.如何在C#中訪問JavaScript的已有變數?
4.如何在C#中訪問JavaScript函數?
問題1答案如下:
javaScript函數中執行C#代碼中的函數:
方法一:1、首先建立一個按鈕,在後臺將調用或處理的內容寫入button_click中;
2、在前臺寫一個js函數,內容為
document.getElementById("btn1").click();
3、在前臺或後臺調用js函數,激發click事件,等於訪問後臺c#函數;
方法二:1、函數聲明為public
後臺代碼(把public改成PRotected也可以)
1 public string ss() 2 { 3 return("a"); 4 }
2、在html里用可以調用
前臺腳本
1 <script language=javascript> 2 3 var a = "<%=ss()%>"; 4 5 alert(a); 6 7 </script>
方法三:1、
1 <script language="javascript"> 2 3 <!-- 4 5 function __doPostBack(eventTarget, eventArgument) 6 7 { 8 9 var theForm = document.Form1; //指runat=server的form 10 11 theForm.__EVENTTARGET.value = eventTarget; 12 13 theFrom.__EVENTARGUMENT.value = eventArgument; 14 15 theForm.submit(); 16 17 } 18 19 --> 20 21 </script> 22 23 <input id="Button1" type="button" name="Button1" value="按鈕" onclick="javascript:__doPostBack('Button1','')">
方法四:
1 <script language="javascript"> 2 3 function SubmitKeyClick() 4 5 { 6 7 if (event.keyCode == 13) 8 9 { 10 11 event.cancelBubble = true; 12 13 event.returnValue = false; 14 15 document.all.FunName.value="你要調用的函數名"; 16 17 document.form[0].submit(); 18 19 } 20 21 } 22 23 </script> 24 25 <INPUT onkeypress="SubmitKeyClick()" id="aaa" type="text"> 26 27 <input type="hidden" name="FunName"> 〈!--用來存儲你要調用的函數 --〉
在.CS里有:
public Page_OnLoad() { if (!Page.IsPost()) { string strFunName=Request.Form["FunName"]!=null?Request.Form["FunName"]:""; //根據傳回來的值決定調用哪個函數 switch(strFunName) { case "enter()": enter() ; //調用該函數 break; case "其他": //調用其他函數 break; default: //調用預設函數 http://www.cnblogs.com/sosoft/ break; } } } public void enter() { //……比如計算某值 }
問題2.如何在JavaScript訪問C#變數?
答案如下:
方法一:1、通過頁面上隱藏域訪問
<input id="xx" type="hidden" runat="server">
方法二:1、如後臺定義了PUBLIC STRING N; 前臺js中引用該變數的格式為''或"++"
方法三:1、或者你可以在伺服器端變數賦值後在頁面註冊一段腳本
"<script language='javascript'>var temp=" + tmp + "</script>"
tmp是後臺變數,然後js中可以直接訪問temp獲得值。
問題3.如何在C#中訪問JavaScript的已有變數?
答案如下:
方法一:1、前臺使用靜態文本控制項隱藏域,將js變數值寫入其中;2、後臺用request["id"]來獲取值;
方法二:可以用cookie或session
問題4.如何在C#中訪問JavaScript函數?
答案如下:
c#代碼中執行javaScript函數:
方法一:1、
Page.RegisterStartupScript("ggg"," ");
方法二:使用Literal類,然後
1 private void Button2_Click(object sender, System.EventArgs e) 2 { 3 string str; 4 str=" "; 5 //Literal1.Visible=true; 6 Literal1.Text=str; 7 }