SharePoint物件模型效能考量(2)

2021-06-16 22:36:20 字數 4806 閱讀 5695

開發過程的一些效能總結

1. 取得列表中的item的數量:

int count = spcontext.current.list.items.count;

這句是取得item的數目,不得不取得列表中的所有的item的metadata,這樣我們程式執行的速度就會相對慢一些,如果列表中的資料量不大,那不會有明顯的影響,如果列表中的資料量很大,那在效率上會有很大的影響。

int count = spcontext.current.list.itemcount;//建議使用這個來取得列表中的item數量。

2. 顯示列表中的item

splist list = spcontext.current.list;

for(int i=0;i<50;i++)

這樣每次都會請求splistitemcollection集合的新的物件,而使item集合物件沒有被快取。因此不斷的從資料庫請求所有的資料項,對效能上造成很大的影響。

建議的方法是:

splistitemcollection item = spcontext.current.list.items;

for(int i=0;i<50;i++)

3. 取得item物件

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 列表資料項

for(int itemindex=0;itemindex<100;itemindex++)

實際上item的add 或是update方法是呼叫了乙個儲存過程,來完成這個操作的。

如果需要大量的資料更行的使用建議使用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. 字串的比較操作

在比較的時候我們應該注意是否忽略大小寫,這個地方是很容易出現問題的地方。

string name1 = 「a」;

string name2 = 「a」;

bool flag = name1.equals(name2);// flag 是false

bool flag = name1.equals(name2, stringcomparison.ordinalignorecase);//flag 是true

9. 在sharepoint中我們要設定folder的許可權,首先我們要打破原有的繼承的許可權,但是這裡有乙個問題需要注意一下:

如果使用folder.item.breakroleinheritance(false)的時候會丟擲乙個異常,原因是sharepoint api中原有這個問題。我們解決這個問題通常使用folder. item.breakroleinheritance(true);然後我們在刪除掉他原有的許可權。這樣操作之後再給這個folder賦予新的許可權即可。

10. 保持程度的可讀性

(1) 在程式中最好不要多次使用return , 盡量在程式結束或是我們的邏輯完成的時候進行return例如:

if(testvalue == 1)

else if(testvalue == 2)

…….

建議使用如下方法:

int returnvalue =0;

if(testvalue ==1)

elseif(testvalue ==2)

……return returnvalue;

(2) 在程式中盡量不要使用goto語句,使用goto語句使程式非常的不可讀,可能之後編寫程式的人才懂程式的意思,其他人根本看不懂程式是完成什麼功能的,還有可能時間長了,編寫程式的人自己也不懂具體是什麼意思了,這樣會非常糟糕,不利於以後的擴充套件和維護。

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...