1. 程式人生 > >從《加速VB》說開去

從《加速VB》說開去

前一段收的網易期刊裡有一篇《加速VB》,我以為切實說到了大多數VB程式設計師的缺點,所以不嫌羅嗦,在這裡先複述一遍。 

在此篇裡,主要的一段程式的三種寫法,因為原文被我給誤刪掉了,我只是憑記憶寫出,和原文程式有出入,但大體不錯,首先是作者的朋友的: 

If Form1.WindowState = vbNormal Then
    MsgBox "此視窗在正常狀態"
Else
    If Form1.WindowState = vbMinimized Then
        MsgBox "此視窗在最小化狀態"
    Else
        If Form1.WindowState = vbMaximized Then
            MsgBox "此視窗在最大化狀態"
        End If
    End If
End If

然後是作者的朋友修改後的: 

With Form1
    If .WindowState = vbNormal Then
        MsgBox "此視窗在正常狀態"
    ElseIf .WindowState = vbMinimized Then
        MsgBox "此視窗在最小化狀態"
    ElseIf .WindowState = vbMaximized Then
        MsgBox "此視窗在最大化狀態"
    End If
End With

然後是作者修改後的: 

Select Case Form1.WindowState
Case vbNormal
    MsgBox "此視窗在正常狀態"
Case vbMinimized
    MsgBox "此視窗在最小化狀態"
Case vbMaximized
    MsgBox "此視窗在最大化狀態"
End If

至此,作者修改的是當然的最好的程式,以下我來簡單分析一下這三段程式。 

其實第一段程式和第二段程式沒有本質區別,其中的 With 語句也沒有起到應有的作用——比如有一屬性“Form1.Picture1.Picture.Height”使用“With Form1.Picture1.Picture”有用,但是在這裡沒有用,VB幫助裡說VB為每一個“.”付出一些分析的時間,第二段程式裡使用 With 並沒有減少“.”的用量,所以速度並不會加快,只是看上去比較整齊罷了。 

第三段程式當然是標準的用法,事實上,遇到這種問題的首選自然是“Select Case”,這應該說是一個習慣問題,不過養成好的程式設計習慣至關重要。但是從很多人不使用“Select Case”來看,很有些倉促上陣的感覺,我並不是想強調程式設計一定要科班出身,但是對程式設計來說,對語言有一種整體的瞭解很重要,對於類或控制元件的用法我們大可以慢慢的查,但對於類似“Select Case”這樣的語句一定在程式設計序前就要有充分的瞭解。 

現在我想改寫以上程式,不記得原作者是不是用的“Form1”,不過我用“Me”,簡單而且移植性強,這個習慣也很好,推薦使用,好了,再說一下以上程式可以這樣寫: 

Dim S: S = Array("正常", "最小化", "最大化")
MsgBox "此視窗在" & S(Me.WindowState) & "狀態"

可能大多數人對這種寫法比較陌生,甚至會有抵制思想,但是這卻是一種最小的寫法,速度上也不會比“Select Case”慢,因為“Select Case”可以判斷字串,還有許多同級的複雜格式(可參見“Select Case”的VB幫助),勢必速度更慢,不信各位大可進行測試,如果我錯了,我將會對有個VB重新認識了。 

其實,不規則的寫法不止一個,下面我再寫一個: 

Dim S As Integer: S = Me.WindowState
MsgBox "此視窗在" & Switch(S=0,"正常",S=1,"最小化",S=2,"最大化") & "狀態"

為了使行短一些,我用數字而不是系統定義的變數進行測試,我在這裡舉例並沒有什麼大礙,但這不是一個好習慣,很可能在你回頭升級程式時才會發現有太多的類似的地方需要修改,不過到那時就悔之晚矣! 

在這裡我用變數 S 取得“Me.WindowState”的值進行判斷,不只是程式變短,而且速度更快,為什麼是這樣呢?如果大家編過“類模組”,編過“屬性”的話,就會知道“屬性”其實是由兩個函式組成的,一個變數之於一個函式,自然“變數”的速度快了,其實我在這裡是有過教訓的,這就是為“VBAPI”寫的搜尋程式,以前我是這樣寫的: 

sub B2_onClick()
 dim i,v,n:v=trim(T2.value):n=len(v)
 if n>0 then
  answer.innerhtml=""
  for i=0 to ubound(index)
   if instr(1,index(i),v,1) then
    answer.innerhtml=answer.innerhtml & _
     "<a href='" & index(i) & ".htm'>" & index(i) & "</a><br>"
   end if
  next
 else
  MsgBox "請輸入有效的搜尋關鍵字"
 end if
end sub

在使用中,如果所查到的項數不多,這個程式執行的也非常好,但是項數多時簡直要死掉了,我讓它查所有的 API 名時,不得不小睡了一覺。 

然後我考慮要優化,遍查程式,我認為最吃時間的就是“answer.innerhtml”了,於是將程式改為以下: 

sub B2_onClick()
 answer.innerhtml="正在搜尋,請稍候……"
 setTimeout "B2onClick()",100
end sub
sub B2onClick()
 dim i,v,n,t:t="":v=trim(T2.value):n=len(v)
 if n>0 then
  for i=0 to ubound(index)
   if instr(1,index(i),v,1) then
    t=t & "<a href='" & index(i) & ".htm'>" & index(i) & "</a><br>"
   end if
  next
  answer.innerhtml=t
 else
  MsgBox "請輸入有效的搜尋關鍵字"
 end if
end sub

現在大家看到了,程式最主要的變化只在於定義了一個“t”,但是卻使此程式增速不止十倍!如果想體驗一下這種速度差異,我的主頁上有“VBAPI”,其中包括我以前寫的搜尋程式和修改後的。 

這兩天,我加入了網易社群,而後在網易的討論版上我見到一個問題說“怎麼提取完整路徑名裡的檔名”,如從完整路徑名“c:/tools/winrar/winrar.exe”中提取“winrar.exe”,有一人回答查詢最後一個“/”,這種回答是對的,不過我有更好的辦法,所以也回答了一下: 

Dim F As String, x
F = "c:/tools/winrar/winrar.exe"
x = split(F, "/") 'VB6 格式,和我寫的“Perl2”模組引數不同
F = x(UBound(x))

而後提問題的人給我留言說我是他的救星,雖然肉麻,我也滿接受的。只不過我想說一下,Split 確實很好用,但即使沒有我以上的那一段程式,沒有 Split 函式,也不至於一籌莫展的: 

Dim F As String, t As Integer, t1 As Integer
F = "c:/tools/winrar/winrar.exe"
Do
    t = t1 + 1
    t1 = InStr(t, F, "/")
Loop Until t1 <= 0
F = Mid(F, t)

這一段程式也不見得比上一段複雜多少,我願意相信各位都能編出來,也衷心希望如此,若非,則其他人笑罵 VB 程式設計師沒水平也就不值得奇怪了!

相關推薦

“盜版”說

       發行了幾年的共享軟體“VB原始碼之友”終於被盜版了,雖然共享軟體沒有給我帶來讓人羨慕的財富,但是這幾年來也有不少的正版使用者群在默默的支援著我繼續推出我的軟體產品。 我的心情其實很複雜,但卻沒有憤怒,在我腦中揮之不去的卻是“盜火”英雄普羅米修斯的偉大形象。想想看

printf說(一)

        看到csdn上的一篇熱帖,printf(“%f”, 10/3);輸出結果是什麼?答案可能讓很多人都大吃一驚。於是乎大家自己寫程式碼來輸出測試,有的說是0.000000,有的說是自己測試的結果是每次輸出都不同。        更準確一點的結論應該是輸出結果不確定。上面提到的2個測試結果都是可能

virtualDOM說

我們知道,前端開發的最佳實踐意義包括效能優化,前端的效能優化就包括儘可能的減少DOM操作1.效能    1.1注意作用域                避免全域性查詢完全用 let 代替 var (避免變數宣告提升) const 代替 不可變變數避免 with 語句O(1)

printf說(四)

   (接上文)    對於函式:    float sumfunf(int num, …)   {         char* args = (char*)(&num)+sizeof(num);          double result = 0;         for(int n = 0;

printf說(三)

     (接上回)         我們在C/C++程式碼中使用:             printf(“%f”, 10/3, 0×40080000 );         看到執行結果了嗎?為什麼這行看起來不合乎所謂的語法的printf能輸出3.000000呢?    

加速VB》說

前一段收的網易期刊裡有一篇《加速VB》,我以為切實說到了大多數VB程式設計師的缺點,所以不嫌羅嗦,在這裡先複述一遍。 在此篇裡,主要的一段程式的三種寫法,因為原文被我給誤刪掉了,我只是憑記憶寫出,和原文程式有出入,但大體不錯,首先是作者的朋友的: If Form1.WindowState = vbNormal

MySQL slave system lock延遲說

本文主要分析 sql thread中system lock出現的原因,但是筆者並明沒有系統的學習過master-slave的程式碼,這也是2018年的一個目標,2018年我都排滿了,悲劇。所以如果有錯誤請指出,也作為一個筆記用於後期學習。同時也給出筆者現在知道的幾種造成延遲的可能和延遲計算的方式

Swift 的面向協議程式設計說

寫在最前 文章標題談到了面向協議程式設計(下文簡稱 POP),是因為前幾天閱讀了一篇講 Swift 中 POP 的文章。本文會以此為出發點,聊聊相關的概念,比如介面、mixin、組合模式、多繼承等,同時也會藉助各種語言中的例子來闡述我的思想。 那些老生常談的概念,相信每位讀者都耳熟能詳了,我當然不會無聊到浪

埋頭做事與擡頭看路說

我一直在思考自己為什麼該埋頭做事的時候卻擡頭看路,甚至因此我還在回憶自己是否有過無路可走的經歷以及是否被這種經歷搞出心理陰影。結果是都沒有。機會不是每天都有的。注意它有兩個意思:一,不要急,沒有機會的時候耐心等待機會,完善自身。二,要珍惜,到手的機會要好好把握,創造價值。但我發現一個問題,我不太會把握機會。工

安全、監控與災備說,談運維管理防線建設

作者介紹 戰學超,青航資料架構師。曾任職於NEC軟體、海爾B2B平臺鉅商匯,負責企業資料平臺構建、B2B電商平臺數據管理與搭建。擁有豐富DBA、系統運維架構經驗,擅長資料庫、資料平臺搭建、私有云部署、自動化運維等。 在搭建運維管理平臺時,安全是不得不面對的重點模組之一。這裡結合我最近所研究以及我司在

附加資料Overlay說-記一次討論

今天和兩個小夥伴討論了幾個問題,我對問題的回答和討論作以記錄.方便後來者學習. 怎麼判斷一個程式是否有附加資料呢? 人物: Kitty,柱子,琦哥 開始 柱子:怎麼判斷一個程式是否有附

斐波那契數-爬樓梯問題說

正式講一下斐波那契數: 首先我們知道有一個著名的演算法面試題: 一共有n個臺階,你一次可以走一個臺階,或者兩個臺階。那麼,走到臺階頂時,一共有多少種走法。 比如三個臺階,你可以 1,2。。。或者1,1,1 或者2,1。。一共三種走法。 網路上會有幾種做法

Python列表Remove操作的一個小問題說

  一.問題 :        前兩天因工作需要,寫了一個Python小程式, 將某目錄下所有長度小於19的資料夾過濾掉,例如這個這個目錄:                過濾完成後,只需要剩餘“

一次python程式的效能優化說

一門程式語言入門是容易的,至少大家都知道從hello world開始。但這次效能優化的經歷告訴我,“換語言”這件事是有門檻的。 這次效能優化是針對資料入庫流程中的一個環節(brief)做的。 我們常說解決問題重要,發現問題更重要。沒錯,這次發現問題就佔用了我

斐波那契數_樓梯問題說

正式講一下斐波那契數: 首先我們知道有一個著名的演算法面試題: 一共有n個臺階,你一次可以走一個臺階,或者兩個臺階。那麼,走到臺階頂時,一共有多少種走法。 比如三個臺階,你可以 1,2。。。或者1,1,1 或者2,1。。一共三種走法。 網路上會有幾種做法, 1.直接思路

豆瓣說和Backbone.js說

簡而言之,Backbone.js是一個可以在前端組織MVC的javascript框架。 寫的Javascript程式碼一旦多起來,沒有一個好的組織,那就會像噩夢一樣。 Backbone提供了Models, Collections, Views。Models 用來建立資料,校

面試官問“為什麼選擇mysql資料庫”說

前幾天面試,面試官問我:“為什麼選擇mysql資料庫”。現在想想,有如下的問題需要解決 關係型資料庫有什麼特點及舉例 非關係型資料庫有什麼特點及舉例 關係型資料庫與非關係型資料庫有什麼區別 關係型資

宜家廁所前說

如果說有這麼一個地方,去逛就是去學習,去消費也是去學習,你去不去? 如果你去,我告訴你,這個地方就是宜家家居大賣場。 對宜家一直有好感,在上海這個地方,能夠給人留下深刻印象的大賣場恐怕只此一家,這讓我對這家來自歐洲的世界五百強企業充滿了敬仰。 時隔一年多了,週末再次被老婆拉去宜家逛了一下午。常去常新。這次收

合並兩個Map說 - foldLeft 和 foldRight 還有模式匹配

pan 開發者 簡化 ase map集合 兩個 簡單 tro 嘗試 開發中遇到需求:合並兩個Map集合對象(將兩個對應Key的值累加) 先說解決方案: ( map1 /: map2 ) { case (map, (k,v)) => map + ( k ->

需求的角度理解Linux系列:總線、設備和驅動

電平 可移植性 需求 講解 好處 鼠標 地理 embed 博客專家 筆者成為博客專家後整理以前原創的嵌入式Linux系列博文,現推出以讓更多的讀者受益。 《從需求的角度去理解linux系列:總線、設備和驅動》是一篇有關如何學習嵌入式Linux系統的方法論文章,也是從