開發過程的一些效能總結
1. 取得列表中的item的數量:
int count = spcontext.current.list.items.count;
這句是取得item的數目,不得不取得列表中的所有的item的metadata,這樣我們程式執行的速度就會相對慢一些,如果列表中的資料量不大,那不會有明顯的影響,如果列表中的資料量很大,那在效率上會有很大的影響。
int count = spcontext.current.list.itemcount;//建議使用這個來取得列表中的item數量。
2. 顯示列表中的item
這樣每次都會請求splistitemcollection集合的新的物件,而使item集合物件沒有被快取。因此不斷的從資料庫請求所有的資料項,對效能上造成很大的影響。splist list = spcontext.current.list;
for(int i=0;i<50;i++)
建議的方法是:
3. 取得item物件splistitemcollection item = spcontext.current.list.items;
for(int i=0;i<50;i++)
splistitem item = spcontext.current.list.items[0];
這句主要是從list中先取得物件的所有的item的metadata,然後再從這些item的集合中取得到index是0的item
建議使用下面語句進行取得item物件:
splistitem item = spcontext.current.list.getitembyid(0);
兩句sdk執行的區別就是我們使用sql語句進行查詢的時候,第一沒有設定where子句的條件,而第二句則是設定了where子句的條件,在資料量很大的情況下,這樣第二句執行的速度會遠遠大於第一句執行的速度。
4. 更新大量的sharepoint 列表資料項
實際上item的add 或是update方法是呼叫了乙個儲存過程,來完成這個操作的。for(int itemindex=0;itemindex<100;itemindex++)
如果需要大量的資料更行的使用建議使用spweb的processbatchdata方法進行更新。具體例項如下:
spcontext.current.web.processbatchdata(querystring);
5. 取得sharepoint的列表物件
splist list = spcontext.current.web.lists[title];
這句取得列表物件先從站點中取得所有的list的metadata和title進行比較,找到符合條件的list之後返回。
建議使用下面的方法取得列表物件:
splist list = spcontext.current.web.getlist(listurl);或
splist list = spcontext.current.web.getlistbyurl(listurl);
6. 如果遇到字串拼接,我們通常使用stringbuilder,而不是直接使用字串直接的鏈結
字串直接的鏈結需要的記憶體量很大,效率很低。建議方法如下:
不建議使用的方法是:stringbuilder msgstring = new stringbuidler();
string message = msgstring.tostring();
string message = 「message1」+」message2」;
特別是在訊息字串很長的情況下。程式執行的效率相當的低。
7. sharepoint中有一些物件是非託管的物件,所以需要我們手動進行釋放,防止記憶體洩漏。
例如:spsite,spweb等等其他一些物件。但是需要注意的是我們如果使用全域性的spweb,就不應該進行釋放,例如:spcontext.current.web就是乙個全域性的web物件,當我們使用這個物件的時候,我們不應該把這個物件進行dispose。
一般的釋放非託管物件的方法有兩種:
8. 字串的比較操作
在比較的時候我們應該注意是否忽略大小寫,這個地方是很容易出現問題的地方。
9. 在sharepoint中我們要設定folder的許可權,首先我們要打破原有的繼承的許可權,但是這裡有乙個問題需要注意一下:string name1 = 「a」;
string name2 = 「a」;
bool flag = name1.equals(name2);// flag 是false
bool flag = name1.equals(name2, stringcomparison.ordinalignorecase);//flag 是true
如果使用folder.item.breakroleinheritance(false)的時候會丟擲乙個異常,原因是sharepoint api中原有這個問題。我們解決這個問題通常使用folder. item.breakroleinheritance(true);然後我們在刪除掉他原有的許可權。這樣操作之後再給這個folder賦予新的許可權即可。
10. 保持程度的可讀性
(1) 在程式中最好不要多次使用return , 盡量在程式結束或是我們的邏輯完成的時候進行return例如:
建議使用如下方法:if(testvalue == 1)
else if(testvalue == 2)
…….
(2) 在程式中盡量不要使用goto語句,使用goto語句使程式非常的不可讀,可能之後編寫程式的人才懂程式的意思,其他人根本看不懂程式是完成什麼功能的,還有可能時間長了,編寫程式的人自己也不懂具體是什麼意思了,這樣會非常糟糕,不利於以後的擴充套件和維護。int returnvalue =0;
if(testvalue ==1)
elseif(testvalue ==2)
……return returnvalue;
11. 判斷字串是否為空串,應該盡量使用下面方法:
string message = 「123」;
bool flag = string.isnullorempty(message);
我們在初始化乙個空字串的時候,應該盡量使用如下方法:
string str1 = string.empty;
盡量不要使用 string str2 = 「」;
因為這兩種記憶體分配的方式,是不同的,c#內部處理的機制也是不相同的。
12. 注意c#中的拆箱和裝箱問題
在程式設計實踐中我們如果使用listlists = new list();,能夠解決的問題,最好不要使用arraylist和hashtable等集合,因為arraylist、hashtable這樣的集合會存在拆箱和裝箱問題,占用程式很大的效能,如果數量過多會嚴重影響效能。
13. sharepoint中的非託管物件需要我們手動釋放資源
spglobaladmin、spsite、spweb、spfilestream等等一些物件需要進行手動釋放資源。由於sharepoint中有這些非託管物件,所以我們程式設計的時候應該特別注意,如果有些資源沒有釋放,會造成記憶體溢位。並且很多時候我們自定義的程式是由iis呼叫的,如果沒有釋放資源,可能會是iis 崩潰,造成不必要的麻煩。
14. sharepoint中不能上傳大小為0 kb的檔案,由於sharepoint上傳文件的時候會將這個檔案的內容一併寫進資料庫的content欄位,如果檔案的大小是0,則這個byte 將沒有內容,所以不會成功。如果我們要對0kb的檔案進行上傳的話,我們需要使用程式進行特殊處理:
一是可以在這個檔案中新增我們的標識資訊,當取得其中的內容的時候我們也可以將標識資訊去掉,然後就是內容資訊。或者使用api也是可以處理新增0 kb 檔案的。或者使用explorer view進行上傳也可以上傳大小為0 kb的檔案。
16. sharepoint中的記憶體洩漏問題
(1) 當使用 list.parentweb,或folder.parentweb 等等只要使用這個parentweb屬性,那麼這個parentweb是需要釋放的。
(2) 同樣道理,我們只要使用了web.site屬性,那麼這個site物件是需要釋放的。
(3) 我們一般對這兩個物件進行釋放的時候,都是使用dispose()方法,其實dispose()方法內部也只是簡單的呼叫了close()方法,但是我們還是建議使用dispose()方法進行釋放。這樣不會造成一些sharepoint api自身產生的一些錯誤。
(4) 使用openweb()方法和selfservicecreatesite()方法時都會返回乙個spweb物件,這些物件都需要進行手動釋放。
(5) 我們使用索引器取得site或是web的時候,都需要進行手動釋放,因為我們去的了spweb和spsite都會在記憶體中申請相應的空間,但是由於是非託管的物件所以我們還是以需要進行手動釋放的。
(6) 當我們使用spsite的lockissue、owner、secondarycontact屬性的時候,會隱式的呼叫rootweb屬性,所以我們需要對這個rootweb物件進行釋放。
**:
sharepoint物件模型及相關屬性
集合 collection 很多物件都有集合 spweb spwebcollection splist splistcollection 操作 get xxcollection idx xxcollection.get by add xxcollection.add del xxcollection...
sharepoint物件模型效能比較
sharepoint的物件模型的屬性和方法有多種,可能對於一些初學者不明白他們之間有什麼區別,那種更優越,在何種情況下用那種屬性或方法,通過這篇文章你會有所了解 1,splist 有些人喜歡通過列表的名字去獲得列表,using spsite site new spsite strsite 這個例子中...
sharepoint物件模型及相關屬性 轉轉
集合 collection 很多物件都有集合 spweb spwebcollection splist splistcollection 操作 get xxcollection idx xxcollection.get by add xxcollection.add del xxcollection...