Atitit.提升軟體Web應用程式 app性能的方法原理 h5 js java c# php python android .net

来源:http://www.cnblogs.com/attilax/archive/2016/04/16/5399397.html
-Advertisement-
Play Games

Atitit.提升軟體Web應用程式 app性能的方法原理 h5 js java c# php python android .net 1. 提升單例有能力的1 2. 減少工作數量2 2.1. 減少距離2 2.2. 添加索引2 2.3. Dma api2 2.4. Cdn2 2.5. Cache2 ...


Atitit.提升軟體Web應用程式 app性能的方法原理 h5 js java c# php python android .net

 

1. 提升單例有能力的1

2. 減少工作數量2

2.1. 減少距離2

2.2. 添加索引2

2.3. Dma api2

2.4. Cdn2

2.5. Cache2

2.6. Pool技術2

2.7. 減少HTTP請求數2

2.8.  ·更大的數據格式2

2.9. 迴圈展開2

2.10. 迴圈轉置3

2.11. 提高Cache命中率3

2.12. 小組件替換大組件4

3. 並行處理4

3.1. 多線程4

3.2. 資料庫分區4

4. 減少等候4

4.1.  2、流水線(Pipeline)4

4.2. 亂序執行---相關5

4.3. 分支預測5

4.4. 靜態指令調度and 動態指令調整5

4.5. 運算順序調整6

5. 預準備好6

5.1. 查表法6

5.2. 預載入6

6. Lazy load6

6.1. 延時腳本 6

7. 參考6

 

 

1. 提升單例有能力的

 

2. 減少工作數量

2.1. 減少距離

2.2. 添加索引

2.3. Dma api

2.4. Cdn

2.5. Cache

2.6. Pool技術

2.7. 減少HTTP請求數

2.8.  ·更大的數據格式

如今的 64 位處理器是當初的 4 位處理器長期演變的結果。每次轉變都使得處理更大的數據元素速度更快,並支持處理器直接定址更大的記憶體。這些先進特性對於性能的提升和能力上的擴充是十分關鍵的,而沒有這些先進特性,今天的數據密集型應用將難以想像。

對比一下可發現,32 位處理器可直接定址高達 4 GB 的記憶體;而 64 位處理器理論上則可定址高達約 1,800 萬 TB的記憶體(實際定址容量取決於具體部署)。這是一次巨大的飛躍,很可能需要經過一段時間以後,硬體及軟體開發人員才能充分利用那些他們現在已經能夠利用的較大定址空間。

作者::  ★(attilax)>>>   綽號:老哇的爪子  全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊  漢字名:艾龍,  EMAIL:[email protected]

轉載請註明來源: http://www.cnblogs.com/attilax/

 

2.9. 迴圈展開

迴圈展開將兩個或更多個迴圈迭代合併到一起,以減少迴圈計數。迴圈展開雖然常常會導致代碼長度增加,但它可以減少必須執行的指令數。下麵是一個非常簡單的迴圈展開示例,它從迴圈中刪除了一個分支: 

這是經典的速度優化,但許多編譯程式(gcc -funroll-loops)能自動完成這個事,所以現在你自己來優化這個顯得效果不明顯。

不過註意:對於中間變數或結果被更改的迴圈,編譯程式往往拒絕展開,(怕擔責任唄),這時候就需要你自己來做展開工作了.

還有一點請註意,在有內部指令cacheCPU(MMX晶元),因為迴圈展開的代碼很大,往往cache溢出,這時展開的代碼會頻繁地在CPU cache和記憶體之間調來調去,又因為cache速度很高,所以此時迴圈展開反而會變慢.還有就是迴圈展開會影響矢量運算優化。

在最內層迴圈避免使用全局變數和靜態變數,除非你能確定它在迴圈周期中不會動態變化,大多數編譯器們優化變數僅有置成寄存器變數一招,而對於動態變數,它們乾脆放棄對整個表達式的優化.

2.10. 迴圈轉置

有些機器對JNZ(0轉移

有些機器對JNZ(0轉移)有特別的指令處理,速度非常快,如果你的迴圈對方向不敏感,可以由大向小迴圈。

舊代碼:
     for (i = 1; i <= MAX; i++)
    {
        ...
    }

新代碼:
    i = MAX+1;
    while (--i)
    {
        ...
    }

不過千萬註意,如果指針操作使用了i,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1;).當然你可以通過對i做加減運算來糾正,但是這樣加速的作用就沒有了除非類似於以下情況

 

 

2.11. 提高Cache命中率

 

·數組合併·迴圈交換·迴圈合併

·分塊

集中訪問可取入cache的塊狀矩陣,避免全行或全列的讀寫,以增強時間局部性。

 

2.12.  小組件替換大組件

Bootstrap  替換 amazeui

 

 

 

 

 

3. 並行處理

3.1. 多線程

3.2. 資料庫分區

 

4. 減少等候

4.1.  2、流水線(Pipeline


  流水線是現代RISC核心的一個重要設計,它極大地提高了性能。
  對於一條具體的指令執行過程,通常可以分為五個部分:取指令,指令解碼,取操作數,運算(ALU),寫結果。其中前三步一般由指令控制器完成,後兩步則由運算器完成。按照傳統的方式,所有指令順序執行,那麼先是指令控制器工作,完成第一條指令的前三步,然後運算器工作,完成後兩步,在指令控制器工作,完成第二條指令的前三步,在是運算器,完成第二條指令的後兩部……很明顯,當指令控制器工作是運算器基本上在休息,而當運算器在工作時指令控制器卻在休息,造成了相當大的資源浪費。解決方法很容易想到,當指令控制器完成了第一條指令的前三步後,直接開始第二條指令的操作,運算單元也是。這樣就形成了流水線系統,這是一條2級流水線。

 

 

4.2. 亂序執行---相關


  在一個流水線系統中,如果第二條指令需要用到第一條指令的結果,這種情況叫做相關。以上面哪個5級流水線為例,當第二條指令需要取操作數時,第一條指令的運算還沒有完成,如果這時第二條指令就去取操作數,就會得到錯誤的結果。所以,這時整條流水線不得不停頓下來,等待第一條指令的完成。這是很討厭的問題,特別是對於比較長的流水線,比如20級,這種停頓通常要損失十幾個時鐘周期。目前解決這個問題的方法是亂序執行。亂序執行的原理是在兩條相關指令中插入不相關的指令,使整條流水線順暢。比如上面的例子中,開始執行第一條指令後直接開始執行第三條指令(假設第三條指令不相關),然後才開始執行第二條指令,這樣當第二條指令需要取操作數時第一條指令剛好完成,而且第三條指令也快要完成了,整條流水線不會停頓。當然,流水線的阻塞現象還是不能完全避免的,尤其是當相關指令非常多的時候。

 

 

一般來說,當一條語句計算出來的值,後續語句不要理解使用,需要隔幾條語句(通常為4條語句)後再使用前面計算得出的值,這是因為流水線原因,當前面的值計算比較費時,後面的指令就不能執行,流水線就會被阻塞,有些編譯器可以優化,採用亂序執行方式,讓計算語句後面的指令在不等計算語句完成前接著執行,這樣就能夠保證流水線的平滑。

 

4.3. 分支預測

 

轉移
  另一個大問題是條件轉移。在上面的例子中,如果第一條指令是一個條件轉移指令,那麼系統就會不清楚下麵應該執行那一條指令?這時就必須等第一條指令的判斷結果出來才能執行第二條指令。條件轉移所造成的流水線停頓甚至比相關還要嚴重的多。所以,現在採用分支預測技術來處理轉移問題。雖然我們的程式中充滿著分支,而且哪一條分支都是有可能的,但大多數情況下總是選擇某一分支。比如一個迴圈的末尾是一個分支,除了最後一次我們需要跳出迴圈外,其他的時候我們總是選擇繼續迴圈這條分支。根據這些原理,分支預測技術可以在沒有得到結果之前預測下一條指令是什麼,並執行它。現在的分支預測技術能夠達到90%以上的正確率,但是,一旦預測錯誤,CPU仍然不得不清理整條流水線並回到分支點。這將損失大量的時鐘周期。所以,進一步提高分支預測的準確率也是正在研究的一個課題。
  越是長的流水線,相關和轉移兩大問題也越嚴重,所以,流水線並不是越長越好,超標量也不是越多越好,找到一個速度與效率的平衡點才是最重要的。

 

4.4. 靜態指令調度and 動態指令調整

 

4.5. 運算順序調整

通常的演算法設計和程式實現中,人們習慣在需要某數據的地方纔計算出該數據的值,緊接著使用該數據。這是很自然的思維習慣,但對於流水線則會造成麻煩。

兩個運算相繼進行,但後一個運算需要的操作數還沒有被計算出來,只有原地等待,造成了流水線的停滯。

 

5. 預準備好

5.1. 查表法

5.2. 預載入

 

6. Lazy load

6.1. 延時腳本

7. 參考

提升Web應用程式性能的最佳實踐-CSDN.NET.html

[分享]提升系統性能方法初步探討 - 軟體行業 - 暢享論壇.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ![大話設計模式 抽象工廠模式 結構圖][1] 概述 抽象工廠模式(Abstract Factory)是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品 ...
  • 一、首先先建立一個Web Project 二、然後在程式根目錄建立文件夾“DataBase”和“Doc”,分別存放資料庫文件和保存SQL語句,建完如下所示: 三、建立資料庫“dbHibernate”,保存到文件夾“DataBase”下 四、書寫SQL語句,創建“student”表 -- 資料庫名稱 ...
  • 消息通信組件Net分散式系統的核心中間件之一,應用與系統高併發,各個組件之間解耦的依賴的場景。本框架採用消息隊列中間件主要應用於兩方面:一是解決部分高併發的業務處理;二是通過消息隊列傳輸系統日誌。目前業界使用較多的消息隊列組件有RabbitMQ、ActiveMQ、MSMQ、kafka、zeroMQ等 ...
  • 註:本文摘自劉偉老師的博客http://blog.csdn.net/lovelion/article/details/7838679,如有侵權,請聯繫本人! 1.類的UML圖示 在UML中,類使用包含類名、屬性和操作且帶有分隔線的長方形來表示,如定義一個Employee類,它包含屬性name、age ...
  • ENode架構圖 什麼是ENode ENode是一個.NET平臺下,純C#開發的,基於DDD,CQRS,ES,EDA,In-Memory架構風格的,可以幫助開發者開發高併發、高吞吐、可伸縮、可擴展的應用程式的一個應用開發框架。 開源項目地址:https://github.com/tangxuehua ...
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A 集成代碼生成器(開發利器)+快速構建表單; QQ:313596790 free ...
  • Atitit JAVA p2p設計與總結 JXTA 2 JXTA 2 是開放源代碼 P2P 網路的第二個主要版本,它利用流行的、基於 Java 的參考實現作為構建基礎。在設計方面進行了重要的修改,以獲得更高的性能、海量伸縮性和可維護的 P2P 網路。本文建立在 Sing Li 於兩年前發表的 JXT ...
  • Atitit .h5文件上傳 1. 上傳原理1 2. Html1 3. Js2 4. uploadV2.js2 5. upServlet & FileUploadService {3 6. 註意::去除struts的干擾3 7. 參考3 1. 上傳原理 FormData + apache io 2. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...