欢迎光临
我们一直在努力

REDIM陷阱(很多人都看过了吧)-.NET教程,VB.Net语言

建站超值云服务器,限时71元/月

  文章标题:redim preserve 執行效能上的陷阱

christoph wille   aspxcn.com   2002-07-24  

redim preserve 執行效能上的陷阱在 vb 任何使用過陣列的人一定非常熟悉使用 redim 陳述來改變陣列大小,今天, 我將詳細說明為什麼將來最好不要使用這樣的陳述語法,或是至少要很小心考慮使用到它。

redim 可能上的使用
在還沒開始 redim 陳述句之前, 我要藉由程式範例 (redimsamples.aspx) 來說明 redim 最普遍的使用方法。使用到 redim 以及 redim preserve:

<% @page language="vb" %>
<%
dim arrstrings(1) as string
response.write(ubound(arrstrings) & "<br>")

redim arrstrings(20)
response.write(ubound(arrstrings) & "<br>")

redim preserve arrstrings(25)
response.write(ubound(arrstrings) & "<br>")
%>

redim 允許加大以及縮小陣列大小。因此,一個新的陣列會在每一個 instance 中產生,理由是 vb.net 陣列是繼承自 .net runtime 的 system.array,而在產生時,根據定義會有一固定大小。在 c# 中這是很明顯的,就如下的程式碼所示是仿效 redim:

string[] arrtest = new string[1];
// and now we want to change the size: redim arrtest(20)
arrtest = new string[20];

就其本身來說,這並不是問題,問題在於 preserve(今日主題)。當使用 redim 含有 preserve 關鍵字時,之前的元素被保留 – 就如在新的陣列中複製一樣

redim preserve 執行效能上的殺手
原則上,我們已經搞壞了整件事 – redim preserve 陳述句產生一新陣列 – 而之前陣列的元素會複製到新的陣列。這在 vb.net 環境中會暗自發生 (就如過去的 vb 是一樣情形)。除了執行效能漏失外,並不會察覺。為了能夠突顯這種現象,我設定一個迴圈來 redim 陣列 5000 次 (redimloop.aspx)。

<% @page language="vb" trace="true" %>
<%
dim arrstrings() as string
dim i as integer

trace.write("redim","start")

for i = 1 to 5000
  redim preserve arrstrings(i)
  arrstrings(i-1) = i
next

trace.write("redim","end")
%>

當我再追蹤時轉換,就很容易得到執行效能上的資料:
REDIM陷阱(很多人都看过了吧)-.NET教程,VB.Net语言

當然,隨著每次呼叫(以及使用的機器)每次會有不同表現,但是 至少你已懂得相對的執行效能

但是當呼叫 redim preserve 時會暗地發生什麼事?為了說明這點,在 c# 中我仿效 redim 陳述句,就好像在 vb.net 中使用 redim 暗地發生一樣,必須明示出來 (redimloopexplicit.aspx)。

<% @page language="c#" trace="true" %>
<%
string[] arrstrings = new string[1];
int i;

trace.write("redim","start");

for (i=1;i<=5000;i++)
{
  string[] arrhelper = new string[i];
  arrstrings.copyto(arrhelper, 0);
  arrhelper[i-1] = i.tostring();
  arrstrings = arrhelper;
}

trace.write("redim","end");
%>

從這我們能明顯看出 – 首先一個新的陣列大小產生,然後先前的陣列內容會複製到新的陣列。 我指派重述的變數在 c# 中轉型為 string,為求完整,我交換了陣列變數。

要是你認為 vb.net 好像有點不同,那就錯誤了 – 執行效能上完全和 redim preserve 一樣(我的程式碼或許好一點,因為並不需要將減小陣列列入考量)。執行效能的好壞只能藉由與更好的技術作比較才能體會 – arraylist class。

最佳解決方法 – arraylists
動態陣列的最佳解決方法是在system.collections namespace 中使用 arraylist class。 arraylist 可以動態的增長或縮小,且容易使用 (arraylistloop.aspx):

<% @page language="vb" trace="true" %>
<% @import namespace="system.collections" %>
<%
dim arrlist as new arraylist(100)
dim i as long

trace.write("arraylist","start")

for i = 1 to 50000
  arrlist.add(i)
next

trace.write("arraylist","end")
%>

如果你有注意觀察的話你會注意到迴圈不是跑到 5000 而是 50000,理由是: 使用到 5000,並無法測得執行效能。但是使用 50000 就表現的非常明顯:

REDIM陷阱(很多人都看过了吧)-.NET教程,VB.Net语言

執行時間是從 0.02 到 0.6 – 而且是一個有順序的大迴圈。我是要讓 redim preserve 也能隨著重述次數來執行,但是在執行的當中我重新設定 server 的時間。

結論
從這篇文章的課題我們了解到在 vb.net 環境中 redim preserve 最好避免使用。當需要使用動態的陣列時,建議使用 arraylist 因為這看起來比較像是正式的陣列。

 

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » REDIM陷阱(很多人都看过了吧)-.NET教程,VB.Net语言
分享到: 更多 (0)

相关推荐

  • 暂无文章