熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux系統響應速度性能改進實例

2013-11-13 16:05:18  來源: Oracle 

  Cameron Laird 提供了一些有用的示例這些示例對於很有可能在您自己的應用程序開發中發生的各種性能問題而言是很合適的模型
  
  性能突破似乎有兩種不同的實現方式簡單的和困難的這並非陳詞濫調這兩者之間的界限極其清晰
  
  當您聽說了某些簡單的方式時您拍手歎道對極了太棒了雖然在許多情況下實現這些方式的第一個應用需要相當聰明的頭腦但是它們易於理解
  
  另一種方式涉及了仔細的測量專門的知識和大量的調優工作這些過程通常是令人痛苦的也是值得的要視本地條件(比如硬件的具體情況)而定
  
  優秀的程序員可以用困難簡單方式進行工作由於性能對 Linux 程序員而言是非常重要的主題因此我提供了四個來源於實際(編程)生活中的故事它們按困難簡單方式配成兩對
  
  始終從需求入手
  
  死亡和交稅都是不可避免的對於開發人員而言與此差不多同等重要的是仔細考慮需求這是每種編程都會提到的一個主題
  
  盡管性能的確很重要但是處理這種需求的最佳方法往往並不是顯而易見的我經常會碰到一個軟件難題它大致符合這樣的模式程序正處於使用之中它的功能是正確的但是某個用戶使用了一下然後報告說它太慢了需要加速某團隊成員很快添加了監視器這降低一點性能但是使用戶能一直知曉長期運行的計算還需多少時間於是滿意度就增加了
  
  我在 世紀 年代末首次注意到這種現象此後每十年就可以看到一回我覺得從某種意義上講自從計算開始它就一直在發生關鍵並不在於最終用戶容易受騙或者可以被光鮮的裝飾轉移注意力相對我們狹隘專業的性能概念而言他們只是有更廣泛的目的在許多情況下當他們指出計算需要更快一點時他們真正的意思是他們需要更快更可靠地知道該計算將要進行多久得知精確的時間信息後最終用戶可以在計算機延遲期間快樂地安排其它任務
  
  建議參與處理性能的每個人都進行熱身練習首先閱讀或重讀您最喜歡的有關需求管理方面的參考資料下面的參考資料一節提供了幾個有用的起點
  
  其次在您的工具箱中放置一些進度監視器進度欄秒表當您發現讓用戶等得太久時可以迅速地將其插入應用程序中這些根本不用付出太多如下面這兩個示例所示
  
  兩個倒計時示例
  
  執行一個長時間的計算同時又要讓用戶知曉其進度這構成了應用程序設計中一個非常有趣的問題它是個並發性或多任務的實例許多開發人員都相信作為正確的解決方案並發性需要有精巧的機制特別需要有復雜的線程代碼
  
  其實不然下面的參考資料一節列出了一篇較早的 developerWorks 專欄文章我在其中概述了並發性涉及的許多技術此外至少自 年以來基本上已經在所有 UNIX 主機上實現了簡單的並發編程 年這一年 ksh 對其協同進程(coprocess)進行了標准化如果您將下面清單 中的 ksh 源代碼保存為 exksh然後運行它您會看到倒計時顯示等等然後看到 ksh 子進程的結果All done實際運用中您可能會對長期運行的化學計算或數據庫檢索使用類似這樣的操作啟動操作作為子進程但是讓用戶始終知道操作的進展或完成之前還剩多少時間更新顯示只用了幾行源代碼
  
  清單 示例倒計時顯示的 ksh 源代碼
  
  (echo This models a longlasting process; sleep ;
                    echo All done) |&
    for ((i = ; i > ; i))
    do
      printf %d seconds before completion \r $i
      sleep
    done
  
    read p line;   # Discard the title line
    read p line
    echo
    echo Output from the subprocess is $line
  
  
  
  為用戶提供實時信息只需要進行適量的編碼即使基於字符的應用程序也可以做到這一點如果圖形用戶界面(GUI)更適合您的情況那也很簡單許多工具箱都內置了忙碌等待進度顯示如果您還沒有這樣一個工具箱那麼幾行 Tk 或另一個新式的 GUI 工具箱就足以制作有點類似的倒計時鐘面或進度欄下面是一個在幾個頁面試用過的從頭開始做的示例
  
  清單 示例倒計時顯示的 Tk 源代碼
  
  proc countdown {seconds} {
     init
     countdown_kernel $seconds
   }
   
   
   proc countdown_kernel seconds {
     hands $seconds
     if !$seconds return
     after [list countdown_kernel [incr seconds ]]
   }
   
   
   proc draw_hand {angle decorations} {
     eval c create line $::size $::size [get_xy $angle] $decorations
   }
   
   
   proc end_coordinate difference {
     set hand_length [expr $::size * ]
     return [expr $::size + $hand_length * $difference]
   }
   
   
   proc get_xy angle {
     return [list [end_coordinate [expr sin($angle)]]            [end_coordinate [expr cos($angle)]]]
   }
   
   
   proc hands seconds {
     catch {c delete withtag hands}
   
     set twopi
     set seconds_angle [expr $seconds * $twopi / ]
     draw_hand $seconds_angle width tags hands
     set minutes_angle [expr $seconds_angle / ]
     draw_hand $minutes_angle            width capstyle projecting tags hands
   }
   
   proc init {} {
     catch {destroy c}
     set ::size
     set full_diameter [expr * $::size]
     pack [canvas c width $full_diameter height $full_diameter]
     set border
     set diameter [expr * $::size $border]
     c create oval $border $border             $diameter $diameter             fill white outline black
   }
   
   
   countdown
  
  
  
  這個倒計時顯示了分針和秒針如圖 所示其信息內容與前面的程序相同
  
  圖 用 Tk 編碼的模擬倒計時時鐘的外觀
  
  //gif >
  請記住信息可以代替功能您的最終用戶對應用程序的內部狀態越了解他們對您的要求就越少只要讓您的程序顯示它們是如何工作的就可以解決許多明顯的性能問題
  
  排序很難
  
  前面介紹的是簡單的課程沒有專門的編程背景知識的平民百姓也可以理解前面的段落但是排序卻屬於困難這一類而且這肯定是困難的Donald Knuth 的一整卷有關計算的經典系列都致力於研究排序和搜索(請參閱參考資料以獲取對 Knuth 撰寫的 The Art of Computer Programming 的評論的鏈接)
  
  結果證明由於深層次的原因排序是許多性能難題的核心所在性能只是大規模計算的問題人類一次只能理解幾個方面因此對於那些大得要花掉很長時間才能掌握的問題我們采用的方式是用某種方式把它們組織起來或使其結構化排序是這些方式中最常見的一種可以對已排序列表進行二元搜索而不進行線性搜索例如這使得在紐約市電話號簿中進行的手工查找得到了簡化將一個百萬級大小的問題簡化成一個一百萬的對數(也就是大約為 )級的問題
  
  那是典型的排序工作高級算法通常比低級算法快一千倍或更多值得進行巧妙的排序
  
  但是最聰明的做法就是避免進行整體排序或者至少將排序僅限於在不受注意的場合進行這在數據庫管理系統中很常見其它好處之一就是它們允許構造插入時索引需要排序結果時可以直接從索引中讀取這一操作的代價就是創建或插入元素的時間稍微有點長但是如果應用程序具有典型的工作流的話用戶覺察不到這一點
  
  Knuth 的參考資料描述了其它許多策略比如用來在特定的條件下加快排序操作的BoyerMooreRabinKarp統一這些策略的一個公共原則是解決通用問題比解決比較特定的問題更容易數學家對此很熟悉如果將代數中的常見問題考慮成復數而不是實數時那麼這些問題就更容易處理盡管復數算法較難
  
  這就是我對裝飾排序去除裝飾(decoratesortundecorateDSU)的看法假定您擁有這樣的數據集
  
  Jane Jones >
  Dan Smith > 
  Kim Black >

From:http://tw.wingwit.com/Article/program/Oracle/201311/17786.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.