轉自:http://www.doserv.com/article/2012/0831/5299117.shtml
其他方面
我已經闡述完了影響效能的四個主要方面. 然而還有一些比較重要的方面需要說一說,大所屬都可歸結於你的平台或系統內容:
你的儲存子系統在大資料讀寫和小資料讀寫,隨即讀寫和順序讀寫方面是如何進行?在預讀和延遲寫入方面做得怎樣?
你使用的網路通訊協定效率如何?是否可以通過修改參數改善效能?是否有類似於TCP_CORK, MSG_PUSH,Nagle-toggling演算法的手段來避免小訊息產生?
你的系統是否支援Scatter-Gather I/O(例如readv/writev)? 使用這些能夠改善效能,也能避免使用緩衝鏈(見第一節資料拷貝的相關敘述)帶來的麻煩. (說明:在dma傳輸資料的過程中,要求源物理地址和目標物理地址必須是連續的. 但在有的電腦體系中,如IA,連續的儲存空間地址在物理上不一定是連續的,則dma傳輸要分成多次完成. 如果傳輸完一塊物理連續的資料後發起一次中斷,同時主機進行下一塊物理連續的傳輸,則這種方式即為block dma方式. scatter/gather方式則不同,它是用一個鏈表描述物理不連續的儲存空間,然後把鏈表首地址告訴dma
master. dma master傳輸完一塊物理連續的資料後,就不用再發中斷了,而是根據鏈表傳輸下一塊物理連續的資料,最後發起一次中斷. 很顯然 scatter/gather方式比block dma方式效率高)
你的系統的頁大小是多少?快取大小是多少?向這些大小邊界進行對起是否有用?系統調用和環境切換花的代價是多少?
你是否知道鎖原語的饑餓現象?你的事件機制有沒有"驚群"問題?你的喚醒/睡眠機制是否有這樣糟糕的行為: 當X喚醒了Y, 環境立刻切換到了Y,但是X還有沒完成的工作?
我在這裡考慮的了很多方面,相信你也考慮過. 在特定情況下,應用這裡提到的某些方面可能沒有價值,但能考慮這些因素的影響還是有用的. 如果在系統手冊中,你沒有找到這些方面的說明,那麼就去努力找出答案. 寫一個測試程式來找出答案;不管怎樣,寫這樣的測試代碼都是很好的技巧鍛煉. 如果你寫的代碼在多個平台上都運行過,那麼把這些相關的代碼抽象為一個平台相關的庫,將來在某個支援這裡提到的某些功能的平台上,你就贏得了先機.
對你的代碼, "知其所以然", 弄明白其中進階的操作, 以及在不同條件下的花銷. 這不同於傳統的效能分析, 不是關於具體的實現,而是關乎設計. 低層級的最佳化永遠是蹩腳設計的最後救命稻草. map註:下面這段文字原文沒有,這是譯者對於翻譯的理解.
附錄:奧德修斯Odysseus,又譯"奧德賽",神話中伊塔刻島國王,《伊利亞特》和《奧德賽》兩大史詩中的主人公(公元前11世紀到公元前9世紀的希臘史稱作"荷馬時代". 包括《伊利亞特》和《奧德賽》兩部分的《荷馬史詩》,是古代世界一部著名的傑作). 奧德修斯曾參加過著名的特洛伊戰爭,在戰爭中他以英勇善戰、足智多謀而著稱,為贏得戰爭的勝利,他設計製造了著名的"特洛伊木馬" (後來在西方成了“為毀滅敵人而送的禮物”的代名詞). 特洛伊城毀滅後,他在回國途中又經曆了許多風險,荷馬的《奧德賽》就是奧德修斯曆險的記述.
"斯庫拉和卡律布狄斯"的故事是其中最驚險、最恐怖的一幕.
相傳,斯庫拉和卡律布狄斯是古希臘神話中的女妖和魔怪,女妖斯庫拉住在意大利和西西里島之間海峽中的一個洞穴裡,她的對面住著另一個妖怪卡律布狄斯. 它們為害所有過往航海的人. 據荷馬說,女妖斯庫拉長著12隻不規則的腳,有6個蛇一樣的脖子,每個脖子上各有一顆可怕的頭,張著血盆大口,每張嘴有3 排毒牙,隨時準備把獵物咬碎. 它們每天在意大利和西西里島之間海峽中興風作浪,航海者在兩個妖怪之間通過是異常危險的,它們時刻在等待著穿過西西里海峽的船舶. 在海峽中間,卡律布狄斯化成一個大旋渦,波濤洶湧、水花飛濺,每天3次從懸崖上奔湧而出,在退落時將通過此處的船隻全部淹沒.
當奧德修斯的船接近卡律布狄斯大旋渦時,它像火爐上的一鍋沸水,波濤滔天,激起漫天雪白的水花. 當潮退時,海水混濁,濤聲如雷,驚天動地. 這時,黑暗泥濘的岩穴一見到底. 正當他們驚恐地注視著這一可怕的景象時,正當舵手小心翼翼地駕駛著船隻從左繞過旋渦時,突然海怪斯庫拉出現在他們面前,她一口叼住了6個同伴. 奧德修斯親眼看見自己的同伴在妖怪的牙齒中間扭動著雙手和雙腳,掙紮了一會兒,他們便被嚼碎,成了血肉模糊的一團. 其餘的人僥倖通過了卡律布狄斯大旋渦和海怪斯庫拉之間的危險的隘口. 後來又曆經種種災難,最後終於回到了故鄉——伊塔刻島.
這個故事在語言學界和翻譯界被廣為流傳。前蘇聯著名翻譯家巴爾胡達羅夫就曾把"斯庫拉和卡律布狄斯"比作翻譯中"直譯和意譯". 他說: "形象地說,譯者總是不得不在直譯和意譯之間迂迴應變,猶如在斯庫拉和卡律布狄斯之間曲折前行,以求在這海峽兩岸之間找到一條狹窄然而卻足夠深邃的航道,以便達到理想的目的地——最大限度的等值翻譯."
德國著名語言學家洪堡特也說過類似的話: "我確信任何翻譯無疑地都是企圖解決不可能解決的任務. 因為任何一個翻譯家都會碰到一個暗礁而遭到失敗,他們不是由於十分準確地遵守了原文的形式而破壞了譯文語言的特點,就是為了照顧譯文語言的特點而損壞了原文. 介於兩者之間的做法不僅難於辦到,而且簡直是不可能辦到."
曆史上長久以來都認為,翻譯只能選擇兩個極端的一種:或者這種——逐字翻譯(直譯); 或者那種——自由翻譯(意譯). 就好像翻譯中的斯庫拉和卡律布狄斯一樣。如今斯庫拉和卡律布狄斯已成為表示雙重危險——海怪和旋渦的代名詞,人們常說介於斯庫拉和卡律布狄斯之間, 這就是說:處於兩面受敵的險境,比喻危機四伏,用來喻指譯者在直譯和意譯之間反覆作出抉擇之艱難.