Visual_Basic 板


LINE

※ 引述《TonyQ (骨頭)》之銘言: : ※ 引述《TonyQ (骨頭)》之銘言: : → TonyQ:問題已解決 , 不過是用其他方式解決 , 不曉得這問題是否有解 03/03 23:20 : 推 fumizuki:把一百筆串起來還是某些欄位串成同一個欄位? 03/04 19:15 : 推 fumizuki:如果是某些欄位串成同一個欄位 sql 查詢語法就可以了@@ 03/04 19:15 : 每一個欄位是一個字串, : 我今天的問題不是在於SQL的問題。 : 而是在於我兜SQL查出資料來之後, : 我沒有辦法把所有字串疊加起來。:) : 請就它的本意去思考就好 : 如果我今天有2000到一萬個個字串 要疊加, : 不曉得有沒有辦法解決效能的問題?:P VB6的String預設是可變長度 但內部實做其實是一直產生新的刪除舊的 另一種方是是用不可變長度,但是我實測沒有比較快,而且又有長度限制... 那麼就需要使用比較低階的方法了,用講的太麻煩,讓測試程式來說話 '使用API RtlMoveMemory,採傳址方式 Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long) Private Sub Form_Load() Dim a As String, c As Long Dim b As String, lb As Long, d As String, lend As Long Debug.Print Timer '時間開始 For c = 1 To 50000 a = a & Format(c, "00000") Next c Debug.Print Timer '一般方法結束,特殊方法開始 '建立一個「足夠長度」的字串,並填入0 b = String(500000, Chr(0)) lb = StrPtr(b) '預先紀錄字串b的記憶體起始位置 For c = 1 To 50000 d = Format(c, "00000") '因為要CopyMemory, 所以要先儲存要累加的字串 '其實d在迴圈中也會不斷重新製造, 所以也可以想 '辦法用類似的方法避免掉一直重新製造 lend = LenB(d) '注意要用LenB而非Len, 因為VB6是Unicode的 CopyMemory lb, StrPtr(d), lend '將d所在字串位址中長度lend複製到位址lb lb = lb + lend '目標位址偏移計算 Next c b = Left(b, InStr(b, Chr(0)) - 1) '將b結尾多餘的0去掉 Debug.Print Timer '特殊方法結束 Debug.Print a = b '驗證結果為True(字串內容相同) End End Sub ======================= 你可以發現這兩種方法,執行效率差了約100倍 而且隨著c迴圈值的增加,時間差異是成等比級數上升 因為a的重新產生越來越花時間... 注意!由於CopyMemory直接控制記憶體存取,將繞過VB6的記憶體安全機制 如果複製的來源或目標超出預先定義的範圍,將可能導致程式例外錯誤 在測試這一類API時,建議每次執行前都要存檔 在VB6的 工具-選項-環境-程式於執行前: 詢問是否儲存變更 建議把它勾起來 ====================== 此外還有另一種方法 Private Sub Form_Load() Dim a As String, c As Long Dim b As String, lb As Long, d As String, lend As Long Debug.Print Timer '採用CopyMemory方式開始 b = String(5 * 10 ^ 7, Chr(0)) lb = StrPtr(b) For c = 1 To 999999 d = Format(c, "000000") lend = LenB(d) CopyMemory lb, StrPtr(d), lend lb = lb + lend Next c b = Left(b, InStr(b, Chr(0)) - 1) Debug.Print Timer '採用CopyMemory方式結束,採用字串陣列方法開始 Dim z(0 To 2 * 10 ^ 7) As String '故意用比較長的長度 '來驗證z的長度可以設到很大 For c = 1 To 999999 z(c) = Format(c, "000000") Next c a = Join(z, "") Debug.Print Timer '採用字串陣列方式結束 Debug.Print a = b '驗證結果為True End End Sub ====================== 當然,陣列方法還是沒有CopyMemory方式快,但是中間差距很小 連續累加將近100萬個長度為6的字串差距還不到一秒鐘 而且因為沒有動用到API,就沒有異常終止的問題 另外在比較陣列跟CopyMemory方法時,請不要拿原始方法並列 可能要跑很久很久很久...... -- 短句釋義: 書店都不書店了 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.204.46
1F:→ SmallBeeWayn:剛剛才注意到討論的不是VB6, ASP自己研究吧XD 03/12 13:57
2F:→ SmallBeeWayn:不過觀念應該差不了太多就是了 03/12 13:57
3F:推 TonyQ:感恩 :D 03/12 22:15
4F:推 horngsh:是用.NET嗎? 如果是何不用StringBuilder? 03/13 09:14
5F:推 TonyQ:樓上的 原文和這篇文章都寫了 VB6 和 非.net -_-;; 03/13 18:58
6F:推 fumizuki:原po是 ASP 03/14 19:10
7F:→ fumizuki: 吧o.o 03/14 19:11







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP