女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

軟件設計開發性能優化的十種手段(取與舍)

架構師技術聯盟 ? 來源:code2life ? 2022-12-26 11:31 ? 次閱讀

作者(code2life)寫了上中下三篇關于性能優化的文章,內容由淺入深涉及性能方方面面,并不僅僅局限于代碼層面。 于是借花獻佛,把作者的三篇整理合并之后分享給大家。希望你也能有所收獲。 本文是上篇,講解六種通用的“時間”與“空間”互換取舍的手段

引言:取與舍

軟件設計開發某種意義上是“取”與“舍”的藝術。 關于性能方面,就像建筑設計成抗震9度需要額外的成本一樣,高性能軟件系統也意味著更高的實現成本,有時候與其他質量屬性甚至會沖突,比如安全性、可擴展性、可觀測性等等。 大部分時候我們需要的是:在業務遇到瓶頸之前,利用常見的技術手段將系統優化到預期水平。 那么,性能優化有哪些技術方向和手段呢? 性能優化通常是“時間”與“空間”的互換與取舍。 本篇分兩個部分,在上篇,講解六種通用的“時間”與“空間”互換取舍的手段:

索引

壓縮術

緩存術

預取術

削峰填谷術

批量處理術

在下篇,介紹四種進階性的內容,大多與提升并行能力有關

八門遁甲 —— 榨干計算資源

影分身術 —— 水平擴容

奧義 —— 分片術

秘術 —— 無鎖術

每種性能優化的技術手段,我都找了一張應景的《火影忍者》中人物或忍術的配圖,評論區答出任意人物或忍術送一顆小星星。 (注:所有配圖來自動漫《火影忍者》,部分圖片添加了文字方便理解,僅作技術交流用途)

索引術

索引的原理是拿額外的存儲空間換取查詢時間,增加了寫入數據的開銷,但使讀取數據的時間復雜度一般從O(n)降低到O(logn)甚至O(1)。 索引不僅在數據庫中廣泛使用,前后端的開發中也在不知不覺運用。 在數據集比較大時,不用索引就像從一本沒有目錄而且內容亂序的新華字典查一個字,得一頁一頁全翻一遍才能找到; 用索引之后,就像用拼音先在目錄中先找到要查到字在哪一頁,直接翻過去就行了。 書籍的目錄是典型的樹狀結構,那么軟件世界常見的索引有哪些數據結構,分別在什么場景使用呢?

哈希表(Hash Table):哈希表的原理可以類比銀行辦業務取號,給每個人一個號(計算出的Hash值),叫某個號直接對應了某個人,索引效率是最高的O(1),消耗的存儲空間也相對更大。K-V存儲組件以及各種編程語言提供的Map/Dict等數據結構,多數底層實現是用的哈希表。

二叉搜索樹(Binary Search Tree):有序存儲的二叉樹結構,在編程語言中廣泛使用的紅黑樹屬于二叉搜索樹,確切的說是“不完全平衡的”二叉搜索樹。從C++Java的TreeSet、TreeMap,到LinuxCPU調度,都能看到紅黑樹的影子。Java的HashMap在發現某個Hash槽的鏈表長度大于8時也會將鏈表升級為紅黑樹,而相比于紅黑樹“更加平衡”的AVL樹反而實際用的更少。

平衡多路搜索樹(B-Tree):這里的B指的是Balance而不是Binary,二叉樹在大量數據場景會導致查找深度很深,解決辦法就是變成多叉樹,MongoDB的索引用的就是B-Tree。

葉節點相連的平衡多路搜索樹(B+ Tree):B+ Tree是B-Tree的變體,只有葉子節點存數據,葉子與相鄰葉子相連,MySQL的索引用的就是B+樹,Linux的一些文件系統也使用的B+樹索引inode。其實B+樹還有一種在枝椏上再加鏈表的變體:B*樹,暫時沒想到實際應用。

日志結構合并樹(LSM Tree):Log Structured Merge Tree,簡單理解就是像日志一樣順序寫下去,多層多塊的結構,上層寫滿壓縮合并到下層。LSM Tree其實本身是為了優化寫性能犧牲讀性能的數據結構,并不能算是索引,但在大數據存儲和一些NoSQL數據庫中用的很廣泛,因此這里也列進去了。

字典樹(Trie Tree):又叫前綴樹,從樹根串到樹葉就是數據本身,因此樹根到枝椏就是前綴,枝椏下面的所有數據都是匹配該前綴的。這種結構能非常方便的做前綴查找或詞頻統計,典型的應用有:自動補全、URL路由。其變體基數樹(Radix Tree)在Nginx的Geo模塊處理子網掩碼前綴用了;Redis的Stream、Cluster等功能的實現也用到了基數樹(Redis中叫Rax)。

跳表(Skip List):是一種多層結構的有序鏈表,插入一個值時有一定概率“晉升”到上層形成間接的索引。跳表更適合大量并發寫的場景,不存在紅黑樹的再平衡問題,Redis強大的ZSet底層數據結構就是哈希加跳表。

倒排索引(Inverted index):這樣翻譯不太直觀,可以叫“關鍵詞索引”,比如書籍末頁列出的術語表就是倒排索引,標識出了每個術語出現在哪些頁,這樣我們要查某個術語在哪用的,從術語表一查,翻到所在的頁數即可。倒排索引在全文索引存儲中經常用到,比如ElasticSearch非常核心的機制就是倒排索引;Prometheus的時序數據庫按標簽查詢也是在用倒排索引。

數據庫主鍵之爭:自增長 vs UUID。主鍵是很多數據庫非常重要的索引,尤其是MySQL這樣的RDBMS會經常面臨這個難題:是用自增長的ID還是隨機的UUID做主鍵? 自增長ID的性能最高,但不好做分庫分表后的全局唯一ID,自增長的規律可能泄露業務信息;而UUID不具有可讀性且太占存儲空間。 爭執的結果就是找一個兼具二者的優點的折衷方案:

用雪花算法生成分布式環境全局唯一的ID作為業務表主鍵,性能尚可、不那么占存儲、又能保證全局單調遞增,但引入了額外的復雜性,再次體現了取舍之道。

再回到數據庫中的索引,建索引要注意哪些點呢?

定義好主鍵并盡量使用主鍵,多數數據庫中,主鍵是效率最高的聚簇索引;

在Where或Group By、Order By、Join On條件中用到的字段也要按需建索引或聯合索引,MySQL中搭配explain命令可以查詢DML是否利用了索引;

類似枚舉值這樣重復度太高的字段不適合建索引(如果有位圖索引可以建),頻繁更新的列不太適合建索引;

單列索引可以根據實際查詢的字段升級為聯合索引,通過部分冗余達到索引覆蓋,以避免回表的開銷;

盡量減少索引冗余,比如建A、B、C三個字段的聯合索引,Where條件查詢A、A and B、A and B and C

都可以利用該聯合索引,就無需再給A單獨建索引了;根據數據庫特有的索引特性選擇適合的方案,比如像MongoDB,還可以建自動刪除數據的TTL索引、不索引空值的稀疏索引、地理位置信息的Geo索引等等。

數據庫之外,在代碼中也能應用索引的思維,比如對于集合中大量數據的查找,使用Set、Map、Tree這樣的數據結構,其實也是在用哈希索引或樹狀索引,比直接遍歷列表或數組查找的性能高很多。

緩存術

緩存優化性能的原理和索引一樣,是拿額外的存儲空間換取查詢時間。緩存無處不在,設想一下我們在瀏覽器打開這篇文章,會有多少層緩存呢?

首先解析DNS時,瀏覽器一層DNS緩存、操作系統一層DNS緩存、DNS服務器鏈上層層緩存;

發送一個GET請求這篇文章,服務端很可能早已將其緩存在KV存儲組件中了;

即使沒有擊中緩存,數據庫服務器內存中也緩存了最近查詢的數據;

即使沒有擊中數據庫服務器的緩存,數據庫從索引文件中讀取,操作系統已經把熱點文件的內容放置在Page Cache中了;

即使沒有擊中操作系統的文件緩存,直接讀取文件,大部分固態硬盤或者磁盤本身也自帶緩存;

數據取到之后服務器用模板引擎渲染出HTML,模板引擎早已解析好緩存在服務端內存中了;

歷經數十毫秒之后,終于服務器返回了一個渲染后的HTML,瀏覽器端解析DOM樹,發送請求來加載靜態資源;

需要加載的靜態資源可能因Cache-Control在瀏覽器本地磁盤和內存中已經緩存了;

即使本地緩存到期,也可能因Etag沒變服務器告訴瀏覽器304 Not Modified繼續緩存;

即使Etag變了,靜態資源服務器也因其他用戶訪問過早已將文件緩存在內存中了;

加載的JS文件會丟到JS引擎執行,其中可能涉及的種種緩存就不再展開了;

整個過程中鏈條上涉及的所有的計算機和網絡設備,執行的熱點代碼和數據很可能會載入CPU的多級高速緩存。

這里列舉的僅僅是一部分常見的緩存,就有多種多樣的形式:從廉價的磁盤到昂貴的CPU高速緩存,最終目的都是用來換取寶貴的時間。 既然緩存那么好,那么問題就來了:緩存是“銀彈”嗎? 不,Phil Karlton 曾說過:

There are only two hard things in Computer Science: cache invalidation and naming things.

計算機科學中只有兩件困難的事情:緩存失效和命名規范。 緩存的使用除了帶來額外的復雜度以外,還面臨如何處理緩存失效的問題。

多線程并發編程需要用各種手段(比如Java中的synchronized volatile)防止并發更新數據,一部分原因就是防止線程本地緩存的不一致;

緩存失效衍生的問題還有:緩存穿透、緩存擊穿、緩存雪崩。解決用不存在的Key來穿透攻擊,需要用空值緩存或布隆過濾器;解決單個緩存過期后,瞬間被大量惡意查詢擊穿的問題需要做查詢互斥;解決某個時間點大量緩存同時過期的雪崩問題需要添加隨機TTL;

熱點數據如果是多級緩存,在發生修改時需要清除或修改各級緩存,這些操作往往不是原子操作,又會涉及各種不一致問題。

除了通常意義上的緩存外,對象重用的池化技術,也可以看作是一種緩存的變體。 常見的諸如JVM,V8這類運行時的常量池、數據庫連接池、HTTP連接池、線程池、Golang的sync.Pool對象池等等。 在需要某個資源時從現有的池子里直接拿一個,稍作修改或直接用于另外的用途,池化重用也是性能優化常見手段。

壓縮術

說完了兩個“空間換時間”的,我們再看一個“時間換空間”的辦法——壓縮。 壓縮的原理消耗計算的時間,換一種更緊湊的編碼方式來表示數據。 為什么要拿時間換空間?時間不是最寶貴的資源嗎? 舉一個視頻網站的例子,如果不對視頻做任何壓縮編碼,因為帶寬有限,巨大的數據量在網絡傳輸的耗時會比編碼壓縮的耗時多得多。 對數據的壓縮雖然消耗了時間來換取更小的空間存儲,但更小的存儲空間會在另一個維度帶來更大的時間收益。 這個例子本質上是:“操作系統內核與網絡設備處理負擔 vs 壓縮解壓的CPU/GPU負擔”的權衡和取舍。 我們在代碼中通常用的是無損壓縮,比如下面這些場景:

HTTP協議中Accept-Encoding添加Gzip/deflate,服務端對接受壓縮的文本(JS/CSS/HTML)請求做壓縮,大部分圖片格式本身已經是壓縮的無需壓縮;

HTTP2協議的頭部HPACK壓縮;

JS/CSS文件的混淆和壓縮(Uglify/Minify);

一些RPC協議和消息隊列傳輸的消息中,采用二進制編碼和壓縮(Gzip、Snappy、LZ4等等);

緩存服務存過大的數據,通常也會事先壓縮一下再存,取的時候解壓;

一些大文件的存儲,或者不常用的歷史數據存儲,采用更高壓縮比的算法存儲;

JVM的對象指針壓縮,JVM在32G以下的堆內存情況下默認開啟“UseCompressedOops”,用4個byte就可以表示一個對象的指針,這也是JVM盡量不要把堆內存設置到32G以上的原因;

MongoDB的二進制存儲的BSON相對于純文本的JSON也是一種壓縮,或者說更緊湊的編碼。但更緊湊的編碼也意味著更差的可讀性,這一點也是需要取舍的。純文本的JSON比二進制編碼要更占存儲空間但卻是REST API的主流,因為數據交換的場景下的可讀性是非常重要的。

信息論告訴我們,無損壓縮的極限是信息熵。進一步減小體積只能以損失部分信息為代價,也就是有損壓縮。 7f1e7136-8438-11ed-bfe3-dac502259ad0.png 那么,有損壓縮有哪些應用呢?

預覽和縮略圖,低速網絡下視頻降幀、降清晰度,都是對信息的有損壓縮;

音視頻等多媒體數據的采樣和編碼大多是有損的,比如MP3是利用傅里葉變換,有損地存儲音頻文件;jpeg等圖片編碼也是有損的。雖然有像WAV/PCM這類無損的音頻編碼方式,但多媒體數據的采樣本身就是有損的,相當于只截取了真實世界的極小一部分數據;

散列化,比如K-V存儲時Key過長,先對Key執行一次“傻”系列(SHA-1、SHA-256)哈希算法變成固定長度的短Key。另外,散列化在文件和數據驗證(MD5、CRC、HMAC)場景用的也非常多,無需耗費大量算力對比完整的數據。

除了有損/無損壓縮,但還有一個辦法,就是壓縮的極端——從根本上減少數據或徹底刪除。 能減少的就減少:

JS打包過程“搖樹”,去掉沒有使用的文件、函數、變量;

開啟HTTP/2和高版本的TLS,減少了Round Trip,節省了TCP連接,自帶大量性能優化;

減少不必要的信息,比如Cookie的數量,去掉不必要的HTTP請求頭;

更新采用增量更新,比如HTTP的PATCH,只傳輸變化的屬性而不是整條數據;

縮短單行日志的長度、縮短URL、在具有可讀性情況下用短的屬性名等等;

使用位圖和位操作,用風騷的位操作最小化存取的數據。典型的例子有:用Redis的位圖來記錄統計海量用戶登錄狀態;布隆過濾器用位圖排除不可能存在的數據;大量開關型的設置的存儲等等。

能刪除的就刪除:

刪掉不用的數據;

刪掉不用的索引;

刪掉不該打的日志;

刪掉不必要的通信代碼,不去發不必要的HTTP、RPC請求或調用,輪詢改發布訂閱;

終極方案:砍掉整個功能。

畢竟有位叫做 Kelsey Hightower 的大佬曾經說過:

No code is the best way to write secure and reliable applications. Write nothing; deploy nowhere

不寫代碼,是編寫安全可靠的應用程序的最佳方式。什么都不寫;哪里都不部署。

預取術

預取通常搭配緩存一起用,其原理是在緩存空間換時間基礎上更進一步,再加上一次“時間換時間”,也就是:用事先預取的耗時,換取第一次加載的時間。 當可以猜測出以后的某個時間很有可能會用到某種數據時,把數據預先取到需要用的地方,能大幅度提升用戶體驗或服務端響應速度。

是否用預取模式就像自助餐餐廳與廚師現做的區別,在自助餐餐廳可以直接拿做好的菜品,一般餐廳需要坐下來等菜品現做。 那么,預取在哪些實際場景會用呢?

視頻或直播類網站,在播放前先緩沖一小段時間,就是預取數據。有的在播放時不僅預取這一條數據,甚至還會預測下一個要看的其他內容,提前把數據取到本地;

HTTP/2 Server Push,在瀏覽器請求某個資源時,服務器順帶把其他相關的資源一起推回去,HTML/JS/CSS幾乎同時到達瀏覽器端,相當于瀏覽器被動預取了資源;

一些客戶端軟件會用常駐進程的形式,提前預取數據或執行一些代碼,這樣可以極大提高第一次使用的打開速度;

服務端同樣也會用一些預熱機制,一方面熱點數據預取到內存提前形成多級緩存;另一方面也是對運行環境的預熱,載入CPU高速緩存、熱點函數JIT編譯成機器碼等等;

熱點資源提前預分配到各個實例,比如:秒殺、售票的庫存性質的數據;分布式唯一ID等等

天上不會掉餡餅,預取也是有副作用的。 正如烤箱預熱需要消耗時間和額外的電費,在軟件代碼中做預取/預熱的副作用通常是啟動慢一些、占用一些閑時的計算資源、可能取到的不一定是后面需要的。

削峰填谷術

削峰填谷的原理也是“時間換時間”,谷時換峰時。 削峰填谷與預取是反過來的:預取是事先花時間做,削峰填谷是事后花時間做。就像三峽大壩可以抗住短期巨量洪水,事后雨停再慢慢開閘防水。軟件世界的“削峰填谷”是類似的,只是不是用三峽大壩實現,而是用消息隊列、異步化等方式。 常見的有這幾類問題,我們分別來看每種對應的解決方案:

針對前端、客戶端的啟動優化或首屏優化:代碼和數據等資源的延時加載、分批加載、后臺異步加載、或按需懶加載等等。

背壓控制 - 限流、節流、去抖等等。一夫當關,萬夫莫開,從入口處削峰,防止一些惡意重復請求以及請求過于頻繁的爬蟲,甚至是一些DDoS攻擊。簡單做法有網關層根據單個IP或用戶用漏桶控制請求速率和上限;前端做按鈕的節流去抖防止重復點擊;網絡層開啟TCP SYN Cookie防止惡意的SYN洪水攻擊等等。徹底杜絕爬蟲、黑客手段的惡意洪水攻擊是很難的,DDoS這類屬于網絡安全范疇了。

針對正常的業務請求洪峰,用消息隊列暫存再異步化處理:常見的后端消息隊列Kafka、RocketMQ甚至Redis等等都可以做緩沖層,第一層業務處理直接校驗后丟到消息隊列中,在洪峰過去后慢慢消費消息隊列中的消息,執行具體的業務。另外執行過程中的耗時和耗計算資源的操作,也可以丟到消息隊列或數據庫中,等到谷時處理。

捋平毛刺:有時候洪峰不一定來自外界,如果系統內部大量定時任務在同一時間執行,或與業務高峰期重合,很容易在監控中看到“毛刺”——短時間負載極高。一般解決方案就是錯峰執行定時任務,或者分配到其他非核心業務系統中,把“毛刺”攤平。比如很多數據分析型任務都放在業務低谷期去執行,大量定時任務在創建時盡量加一些隨機性來分散執行時間。

避免錯誤風暴帶來的次生洪峰:有時候網絡抖動或短暫宕機,業務會出現各種異常或錯誤。這時處理不好很容易帶來次生災害,比如:很多代碼都會做錯誤重試,不加控制的大量重試甚至會導致網絡抖動恢復后的瞬間,積壓的大量請求再次沖垮整個系統;還有一些代碼沒有做超時、降級等處理,可能導致大量的等待耗盡TCP連接,進而導致整個系統被沖垮。解決之道就是做限定次數、間隔指數級增長的Back-Off重試,設定超時、降級策略。

批量處理術

批量處理同樣可以看成“時間換時間”,其原理是減少了重復的事情,是一種對執行流程的壓縮。以個別批量操作更長的耗時為代價,在整體上換取了更多的時間。 批量處理的應用也非常廣泛,我們還是從前端開始講:

打包合并的JS文件、雪碧圖等等,將一批資源集中到一起,一次性傳輸

前端動畫使用requestAnimationFrame在UI渲染時批量處理積壓的變化,而不是有變化立刻更新,在游戲開發中也有類似的應用;

前后端中使用隊列暫存臨時產生的數據,積壓到一定數量再批量處理;在不影響可擴展性情況下,一個接口傳輸多種需要的數據,減少大量ajax調用(GraphQL在這一點就做到了極致);

系統間通信盡量發送整批數據,比如消息隊列的發布訂閱、存取緩存服務的數據、RPC調用、插入或更新數據庫等等,能批量做盡可能批量做,因為這些系統間通信的I/O時間開銷已經很昂貴了;

數據積壓到一定程度再落盤,操作系統本身的寫文件就是這么做的,Linux的fwrite只是寫入緩沖區暫存,積壓到一定程度再fsync刷盤。在應用層,很多高性能的數據庫和K-V存儲的實現都體現了這一點:一些NoSQL的LSM Tree的第一層就是在內存中先積壓到一定大小再往下層合并;Redis的RDB結合AOF的落盤機制;Linux系統調用也提供了批量讀寫多個緩沖區文件的系統調用:readv/writev;

延遲地批量回收資源,比如JVM的Survivor Space的S0和S1區互換、Redis的Key過期的清除策略。

批量處理如此好用,那么問題來了,每一批放多大最合適呢? 這個問題其實沒有定論,有一些個人經驗可以分享。

前端把所有文件打包成單個JS,大部分時候并不是最優解。Webpack提供了很多分塊的機制,CSS和JS分開、JS按業務分更小的Chunk結合懶加載、一些體積大又不用在首屏用的第三方庫設置external或單獨分塊,可能整體性能更高。不一定要一批搞定所有事情,分幾個小批次反而用戶體驗的性能更好。

Redis的MGET、MSET來批量存取數據時,每批大小不宜過大,因為Redis主線程只有一個,如果一批太大執行期間會讓其他命令無法響應。經驗上一批50-100個Key性能是不錯的,但最好在真實環境下用真實大小的數據量化度量一下,做Benchmark測試才能確定一批大小的最優值。

MySQL、Oracle這類RDBMS,最優的批量Insert的大小也視數據行的特性而定。我之前在2U8G的Oracle上用一些普遍的業務數據做過測試,批量插入時每批5000-10000條數據性能是最高的,每批過大會導致DML的解析耗時過長,甚至單個SQL語句體積超限,單批太多反而得不償失。

消息隊列的發布訂閱,每批的消息長度盡量控制在1MB以內,有些云服務商提供的消息隊列限制了最大長度,那這個長度可能就是性能拐點,比如AWS的SQS服務對單條消息的限制是256KB。

總之,多大一批可以確保單批響應時間不太長的同時讓整體性能最高,是需要在實際情況下做基準測試的,不能一概而論。而批量處理的副作用在于:處理邏輯會更加復雜,尤其是一些涉及事務、并發的問題;需要用數組或隊列用來存放緩沖一批數據,消耗了額外的存儲空間。

作者:code2life 在此特別鳴謝!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3900

    瀏覽量

    65745
  • 軟件設計
    +關注

    關注

    3

    文章

    61

    瀏覽量

    17980
  • Oracle
    +關注

    關注

    2

    文章

    298

    瀏覽量

    35802
  • MySQL
    +關注

    關注

    1

    文章

    849

    瀏覽量

    27506

原文標題:性能優化的十種手段(取與舍)

文章出處:【微信號:架構師技術聯盟,微信公眾號:架構師技術聯盟】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    HarmonyOS NEXT應用開發性能優化入門引導

    使用Web組件的預連接、預加載、預渲染能力(詳細介紹可參考文章:Web組件開發性能提升指導),在應用空閑時間提前進行Web引擎初始化和頁面加載,提升下一頁面的啟動和響應速度。 示例代碼如下: import
    發表于 05-09 14:49

    HarmonyOS Web開發性能優化指導

    的原理,開發者可以更好地處理頁面加載與優化的相關問題,提升應用的整體質量。 文中提供了預連接、預下載、預渲染、預POST、預編譯等多種常見的優化方法,指導
    發表于 12-06 08:41

    十種精密全波整流電路

    十種精密全波整流電路
    發表于 08-09 15:09

    人生要學會,才能活的快樂

    人生要學會,才能活的快樂。……每一個人都是凡人,生活在大千世界。學會,才能活的快樂。筆者喜歡這樣的一句話,是在一個同學的空間上看到的。快樂不在于擁有得多,而在于計較的少。該舍去
    發表于 12-05 14:08

    請問怎么做一個跑馬燈有十種模式,第十種模式有三音樂,可加速減速和無線遙控?

    我現在想做一個跑馬燈,這個跑馬燈有十種模式,第十種模式要求有三音樂。,還得有數碼管顯示第幾種模式。可以無線遙控。求哪位大神可以幫我。小女子必有重謝。
    發表于 07-19 04:49

    請問如何開發性能優異的電容式觸摸屏?

    如何開發性能優異的電容式觸摸屏
    發表于 04-06 09:46

    十種精密全波整流電路原圖分享

    十種精密全波整流電路原圖,大家點評下
    發表于 11-27 06:47

    高速DSP系統中的軟件設計優化

    嵌入式系統的軟件設計手段在不斷進步, 目前通常的開發手段是采用C/C++ 并與匯編語言混合編程。對于復雜的任務調度, 則可以依靠嵌入式操作系統來實現多任務、多進程, 實時
    發表于 04-15 09:15 ?9次下載

    ARM嵌入式系統開發-軟件設計優化

    ARM嵌入式系統開發-軟件設計優化
    發表于 02-11 09:57 ?94次下載
    ARM嵌入式系統<b class='flag-5'>開發</b>-<b class='flag-5'>軟件設計</b>與<b class='flag-5'>優化</b>

    ARM嵌入式系統開發軟件設計優化 電子書下載

    本書從軟件設計的角度,全面、系統地介紹了arm處理器的基本體系結構和軟件設計優化方法。內容包括:arm處理器基礎;arm/thumb指令集;c語言與匯編語言程序的設計與優化;基本運算
    發表于 11-07 16:35 ?391次下載
    ARM嵌入式系統<b class='flag-5'>開發軟件設計</b>與<b class='flag-5'>優化</b> 電子書下載

    ARM嵌入式系統開發_軟件設計優化_part2

    ARM嵌入式系統開發_軟件設計優化part2
    發表于 02-18 17:18 ?18次下載

    十種方法能保護云數據安全

    十種方法能保護云數據安全
    發表于 01-14 12:00 ?12次下載

    基于UML對象建模的財務軟件設計研究

    本篇目的在于研究基于UML對象建模的財務軟件設計。基于當前UML、財務軟件設計相關知識,能夠去優化分析基于UML的財務軟件設計相關需求,開發
    發表于 11-13 17:16 ?6次下載
    基于UML對象建模的財務<b class='flag-5'>軟件設計</b>研究

    十種不同模式實現簡單的計算案例

    labview作為一開發語言其實有許多不同的設計模式,大家在學習工作中接觸最多當屬狀態機,今天我們就通過一個簡單的計算案例用十種不同的模式來實現,主要帶領大家了解不同編程模式之間的區別。
    的頭像 發表于 10-22 11:47 ?2460次閱讀
    <b class='flag-5'>十種</b>不同模式實現簡單的計算案例

    新知同享 | Web 開發性能提升,優化體驗

    現場一覽 Web 開發不斷發展,每年都帶來性能提升和功能迭代,開啟豐富多樣的新體驗,讓開發者能夠獲享高級計算功能。谷歌提供工具和解決方案,幫助開發人員構建符合心意的網頁,既能滿足特定需
    的頭像 發表于 09-09 19:10 ?840次閱讀