none
多個欄位運算值指定給變數 與 重複使用多個欄位運算式 在VS上做運算的效率疑問 RRS feed

  • 問題

  • 有可能我標題取的不好,若版主群們能有更好的標題描數請修改

    我會產生這個疑問是這樣子的

    以前在學校用JAVA寫老師出的資料探勘作業時曾經注意到

    我使用一個迴圈,迴圈裡有使用到"欄位1"+"欄位2"-"欄位3"...等多個欄位運算 與 Integer.ParseInt(Object)等型態轉型

    這個運算值在迴圈內又有多行程式碼會使用

    我若一直複製此運算式貼入要使用的程式碼,JVM似乎會一直重複運算造成效率低下,執行時間很長才會跑出結果

    用變數先存運算值再將變數指給需要的程式碼,執行時間就縮短很多

    (不過很久沒碰JAVA了,不知道這情形有沒有做優化)

    現在任職的公司使用VB.NET,IDE採用VS2010 pro

    老闆不要那麼多的變數,所以整個程式碼幾乎都是上述的狀況

    這樣會不會出現我在大學時JAVA所遇到的情況呢?

    2013年4月12日 上午 03:09

解答

  • 程式是死的,是一行一行執行的。

    變數是重覆使用的觀念,已存在記憶體,一定是快。

    運算式,執行一次,就重新計算一次。如果你以上述的例子,那一定是比存取變數要慢很多,這是非常確定。

    只是這個“慢”的定義,因人而異。

    以你的例子,或許在現行i3/i5/i7的電腦上,根本感覺不出來差異(可能兩者差0.01秒)。不過就程式而言,我們會用一個字來形容:「髒」!

    喜歡不喜歡是一件事,問清楚原因,我認為比較重要。


    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學

    微軟實戰課程日

    • 已標示為解答 GISK 2013年4月12日 上午 09:01
    2013年4月12日 上午 08:53

所有回覆

  • Hi, TechNet 論壇主要為討論 IT 相關技術及產品, 若有程式開發相關, 歡迎您至 MSDN 論壇. 謝謝您!

    請記得對您有幫助的回覆標註為"解答". 以幫助其他尋找解答及參與社群討論的朋友們.
    Please remember to click “Mark as Answer” on the post that helps you. This can be beneficial to other community members reading the thread.

    2013年4月12日 上午 03:17
    版主
  • 把欲重覆使用的資料放在變數再多次取用就是一種優化的處理, 如果老闆不要太多變數, 可以將處理的結果放入陣列或集合, 就不會看到很多變數了
    2013年4月12日 上午 07:24
  • 啊哈哈,我發文的角度是從JAVA看向VS - VB.NET,所以覺得放在VB這邊不太好

    想說應該屬於談天閒聊式的討論 或 VS一般討論才發在別的地方,沒想到還是移回來了

    回正題,感謝tihs 前輩回答

    tihs 前輩的建議還是需要在記憶體配置一個區塊去儲存欄位運算值

    那就非得創立一個變數去存取

    除非在別的區塊(副程式、部份事件)還要使用,否則老闆不待見的就是這種「單純保存運算值」的變數...(即使只有一個也是)

    例如我的公司在計算美金換算台幣(最多3次):

    收美金1*匯率1+美金2*匯率2+美金3*匯率3=總銷貨台幣

    假如我存在TotalNTD變數,我有需要就呼叫TotalNTD

    但目前老闆做法都是複製 "收美金1*匯率1+美金2*匯率2+美金3*匯率3" 來使用

    雖然用變數去保存運算值可以更方便閱讀、瞭解程式,但老闆就是不肯,其實我非常不能認同老闆這個做法 : (

    我主要想理解的是,使用變數多次取用(如 TotalNTD) 與 重複相同欄位運算式(複製美金*匯率),在VS編譯上會不會產生與JAVA一樣的問題?

    印象中JAVA屬於直譯,.NET是編譯,不知道在多行相同程式碼的處理上效率是不是都會很低落


    • 已編輯 GISK 2013年4月12日 上午 08:36 錯字修正
    2013年4月12日 上午 08:32
  • 程式是死的,是一行一行執行的。

    變數是重覆使用的觀念,已存在記憶體,一定是快。

    運算式,執行一次,就重新計算一次。如果你以上述的例子,那一定是比存取變數要慢很多,這是非常確定。

    只是這個“慢”的定義,因人而異。

    以你的例子,或許在現行i3/i5/i7的電腦上,根本感覺不出來差異(可能兩者差0.01秒)。不過就程式而言,我們會用一個字來形容:「髒」!

    喜歡不喜歡是一件事,問清楚原因,我認為比較重要。


    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學

    微軟實戰課程日

    • 已標示為解答 GISK 2013年4月12日 上午 09:01
    2013年4月12日 上午 08:53
  • 安你好

    討論一下,有考慮過 利用 Function 嗎

    參考以下 不使用變數,而是呼叫 Function,剩下就是圈計算或是遞迴的呼叫方式了

        ''' <summary>
        ''' 計算美金換算台幣並加總
        ''' </summary>
        ''' <param name="nt">上一次計算結果</param>
        ''' <param name="us">美金金額</param>
        ''' <param name="rate">匯率</param>
        ''' <returns>回傳計算台幣加總後的金額</returns>
        ''' <remarks></remarks>
        Private Function TotalNTD(ByVal nt As Integer, ByVal us As Integer, ByVal rate As Integer) As Integer
            Dim total As Integer = 0
            total = nt + us * rate
            Return total
        End Function

    如覺得 這也不要 那就改成

    Dim total As Integer = 0

    TotalNTD = nt + us * rate

    Return TatalNTD


    2013年4月12日 上午 09:03
  • 程式是死的,是一行一行執行的。

    變數是重覆使用的觀念,已存在記憶體,一定是快。

    運算式,執行一次,就重新計算一次。如果你以上述的例子,那一定是比存取變數要慢很多,這是非常確定。

    只是這個“慢”的定義,因人而異。

    以你的例子,或許在現行i3/i5/i7的電腦上,根本感覺不出來差異(可能兩者差0.01秒)。不過就程式而言,我們會用一個字來形容:「髒」!

    喜歡不喜歡是一件事,問清楚原因,我認為比較重要。


    理直氣和,切記。

    Blog: http://blog.kkbruce.net

    Book:《ASP.NET MVC 4 網站開發美學

    微軟實戰課程日

    我想我找到為什麼我看公司的程式會那麼痛苦了

    一個「髒」字道盡了我的心情......

    我也跟老闆力爭過用變數存取的好處

    一句:依我從DOS走過來的經驗,完全不需要多一個變數去佔用記憶體空間

    二句:我比較神經質,多一個變數就佔了一份記憶體空間
       反正電腦速度夠快,那一點點時間根本感覺不出來

    然後我就連反駁的機會都失去了,直接秒殺

    說實在的...程式不是老闆在看,即使看也只看一小部份,然後再代入他的「走過DOS時代」榮耀感...

    嗯...

    2013年4月12日 上午 09:10
  • 安你好

    討論一下,有考慮過 利用 Function 嗎

    參考以下 不使用變數,而是呼叫 Function,剩下就是圈計算或是遞迴的呼叫方式了

        ''' <summary>
        ''' 計算美金換算台幣並加總
        ''' </summary>
        ''' <param name="nt">上一次計算結果</param>
        ''' <param name="us">美金金額</param>
        ''' <param name="rate">匯率</param>
        ''' <returns>回傳計算台幣加總後的金額</returns>
        ''' <remarks></remarks>
        Private Function TotalNTD(ByVal nt As Integer, ByVal us As Integer, ByVal rate As Integer) As Integer
            Dim total As Integer = 0
            total = nt + us * rate
            Return total
        End Function

    如覺得 這也不要 那就改成

    Dim total As Integer = 0

    TotalNTD = nt + us * rate

    Return TatalNTD


     

    前輩您好,感謝您的回答

    副程式我唯一成功的只有讀取SQL資料庫部份

    我的狀況更詳細情形在友站有開一個討論串,不過那討論串是比較偏列印方面的

    稍微看過就能了解老闆一句兩句直接秒殺我的情形是怎麼樣了

    VB.NET的列印觀念

    2013年4月12日 上午 09:17
  • 1. 如果你只是欄位相加這種問題,可以參考這個動態編譯的方式:

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Module&Module=36

    2. 記憶體跟效能是取捨關係,以前 DOS 年代是沒有記憶體給你揮霍,所以拿 CPU / HD 來換,現在 Windows 年代是開發時間的效率優先,所以節省開發時間增加記憶體揮霍,花個 1000 元買個幾 GB 讓你揮霍不完,幹嘛浪費時間去搞這種小細節?老闆觀念有問題就把成本列出來給他比較就可以了。

    3. 關於列印那篇... Windows 是圖形導向,如果不用圖形來開發列印,不要用 Windows ,回去用 DOS 。如果要考慮加速,點陣式印表機能像現在噴墨、雷射每分 20 頁以上嗎?如果還要提高列印速度,在噴墨上是沒救了,噴墨全部轉成圖檔點陣輸出,雷射是可以輸出向量圖,雷射印表機支援向量列印,比如說 HP 相容系列都用 PCL ,但是向量圖會吃印表機記憶體,複雜的向量圖印表機記憶體會爆 (GIS 相關軟體比較有機會看到印表機記憶體不足的錯誤,一般文書看不到),而且現在也找不到為了中文列印的字形加速卡,所以印表機根本沒有內建中文字形,英文字型也有限。


    2013年4月14日 上午 10:02
  • 列印、換頁、定位、預覽部分,都有既有討論,VBNET 微軟有內建現成範例。
    2013年4月14日 上午 10:05
  • 感謝心冷熱情熄 前輩的回應

    是不只欄位相加的問題啦,不過我不太懂欄位相加的問題可以用動態編譯的意思?

    記憶體跟效能...也跟老闆提過了,但他覺得這樣子他看比較"順眼",我也沒轍Orz
    程式效率快不起來有很大一部份是老闆的原因,而我的程式能力處在這樣的限制下也沒辦法再進一步提高
    再看看有沒有其他機會了,不過我要先把出社會的經驗先忍滿一年......

    列印那篇的話,老闆就是看不爽微軟現有的處理方式
    不過看著看著,看到這篇關於列印方式之請教,再看一次這個心冷前輩曾經回應別人的內容
    如何使用 Visual Basic.NET 或 Visual Basic 2005年列印 RichTextBox 控制項的內容
    忽然就懂了
    也許可以拿這個來玩點花樣,弄出更簡化一些的列印程式

    2013年4月15日 上午 04:11