人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

REDIM陷阱(很多人都看過(guò)了吧)

REDIM陷阱(很多人都看過(guò)了吧)

更新時(shí)間:2022-07-11 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

文章標(biāo)題:ReDim Preserve 執(zhí)行效能上的陷阱

Christoph Wille aspxcn.com 2002-07-24

ReDim Preserve 執(zhí)行效能上的陷阱在 VB 任何使用過(guò)陣列的人一定非常熟悉使用 ReDim 陳述來(lái)改變陣列大小,今天, 我將詳細(xì)說(shuō)明為什麼將來(lái)最好不要使用這樣的陳述語(yǔ)法,或是至少要很小心考慮使用到它。

ReDim 可能上的使用
在還沒(méi)開(kāi)始 ReDim 陳述句之前, 我要藉由程式範(fàn)例 (redimsamples.aspx) 來(lái)說(shuō)明 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 允許加大以及縮小陣列大小。因此,一個(gè)新的陣列會(huì)在每一個(gè) instance 中產(chǎn)生,理由是 VB.NET 陣列是繼承自 .NET Runtime 的 System.Array,而在產(chǎn)生時(shí),根據(jù)定義會(huì)有一固定大小。在 C# 中這是很明顯的,就如下的程式碼所示是仿效 ReDim:

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

就其本身來(lái)說(shuō),這並不是問(wèn)題,問(wèn)題在於 Preserve(今日主題)。當(dāng)使用 Redim 含有 Preserve 關(guān)鍵字時(shí),之前的元素被保留 - 就如在新的陣列中複製一樣

ReDim Preserve 執(zhí)行效能上的殺手
原則上,我們已經(jīng)搞壞了整件事 - ReDim Preserve 陳述句產(chǎn)生一新陣列 - 而之前陣列的元素會(huì)複製到新的陣列。這在 VB.NET 環(huán)境中會(huì)暗自發(fā)生 (就如過(guò)去的 VB 是一樣情形)。除了執(zhí)行效能漏失外,並不會(huì)察覺(jué)。為了能夠突顯這種現(xiàn)象,我設(shè)定一個(gè)迴圈來(lái) 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")
%>

當(dāng)我再追蹤時(shí)轉(zhuǎn)換,就很容易得到執(zhí)行效能上的資料:



當(dāng)然,隨著每次呼叫(以及使用的機(jī)器)每次會(huì)有不同表現(xiàn),但是 至少你已懂得相對(duì)的執(zhí)行效能

但是當(dāng)呼叫 ReDim Preserve 時(shí)會(huì)暗地發(fā)生什麼事?為了說(shuō)明這點(diǎn),在 C# 中我仿效 ReDim 陳述句,就好像在 VB.NET 中使用 ReDim 暗地發(fā)生一樣,必須明示出來(lái) (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");
%>

從這我們能明顯看出 - 首先一個(gè)新的陣列大小產(chǎn)生,然後先前的陣列內(nèi)容會(huì)複製到新的陣列。 我指派重述的變數(shù)在 C# 中轉(zhuǎn)型為 String,為求完整,我交換了陣列變數(shù)。

要是你認(rèn)為 VB.NET 好像有點(diǎn)不同,那就錯(cuò)誤了 - 執(zhí)行效能上完全和 ReDim Preserve 一樣(我的程式碼或許好一點(diǎn),因?yàn)閬K不需要將減小陣列列入考量)。執(zhí)行效能的好壞只能藉由與更好的技術(shù)作比較才能體會(huì) - ArrayList class。

最佳解決方法 - ArrayLists
動(dòng)態(tài)陣列的最佳解決方法是在System.Collections namespace 中使用 ArrayList class。 ArrayList 可以動(dòng)態(tài)的增長(zhǎng)或縮小,且容易使用 (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")
%>

如果你有注意觀察的話你會(huì)注意到迴圈不是跑到 5000 而是 50000,理由是: 使用到 5000,並無(wú)法測(cè)得執(zhí)行效能。但是使用 50000 就表現(xiàn)的非常明顯:



執(zhí)行時(shí)間是從 0.02 到 0.6 - 而且是一個(gè)有順序的大迴圈。我是要讓 ReDim Preserve 也能隨著重述次數(shù)來(lái)執(zhí)行,但是在執(zhí)行的當(dāng)中我重新設(shè)定 Server 的時(shí)間。


結(jié)論
從這篇文章的課題我們了解到在 VB.NET 環(huán)境中 ReDim Preserve 最好避免使用。當(dāng)需要使用動(dòng)態(tài)的陣列時(shí),建議使用 ArrayList 因?yàn)檫@看起來(lái)比較像是正式的陣列。

 

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 海兴县| 雷州市| 巩义市| 台东县| 盐亭县| 从江县| 阳泉市| 麻栗坡县| 咸阳市| 尖扎县| 蓬溪县| 石河子市| 宁明县| 广灵县| 鲁山县| 拉孜县| 长兴县| 志丹县| 靖江市| 奉节县| 沁源县| 白山市| 天等县| 中山市| 崇信县| 高雄市| 肇东市| 胶州市| 堆龙德庆县| 南安市| 慈利县| 河池市| 武夷山市| 襄汾县| 勐海县| 临泉县| 尼玛县| 高要市| 天台县| 额敏县| 沙洋县|