[{"data":1,"prerenderedAt":1037},["ShallowReactive",2],{"navigation":3,"\u002Farticles\u002Fio-bound-vs-cpu-bound":54,"\u002Farticles\u002Fio-bound-vs-cpu-bound-surround":1032},[4],{"title":5,"path":6,"stem":7,"children":8,"page":53},"Articles","\u002Farticles","articles",[9,13,17,21,25,29,33,37,41,45,49],{"title":10,"path":11,"stem":12},"Async 到底在解決什麼問題？","\u002Farticles\u002Fasync-waiting","articles\u002Fasync-waiting",{"title":14,"path":15,"stem":16},"Callback 是什麼？","\u002Farticles\u002Fcallback","articles\u002Fcallback",{"title":18,"path":19,"stem":20},"Claude Code 的 Skill、MCP、Hook、Plugin 分別是什麼？","\u002Farticles\u002Fclaude-code-skill-mcp-hook-plugin","articles\u002Fclaude-code-skill-mcp-hook-plugin",{"title":22,"path":23,"stem":24},"用 Daily Snapshot 提升統計查詢速度","\u002Farticles\u002Fdaily-snapshot","articles\u002Fdaily-snapshot",{"title":26,"path":27,"stem":28},"GKE 部署","\u002Farticles\u002Fgke-deployment","articles\u002Fgke-deployment",{"title":30,"path":31,"stem":32},"I\u002FO 密集 vs CPU 密集：執行緒數該開多少？","\u002Farticles\u002Fio-bound-vs-cpu-bound","articles\u002Fio-bound-vs-cpu-bound",{"title":34,"path":35,"stem":36},"從 LLM 到 Agent：打通底層邏輯","\u002Farticles\u002Fllm-to-agent","articles\u002Fllm-to-agent",{"title":38,"path":39,"stem":40},"資訊安全實踐","\u002Farticles\u002Fsecurity-best-practices","articles\u002Fsecurity-best-practices",{"title":42,"path":43,"stem":44},"單機架構的性能優化","\u002Farticles\u002Fsingle-machine-performance","articles\u002Fsingle-machine-performance",{"title":46,"path":47,"stem":48},"伺服器渲染 SSR","\u002Farticles\u002Fssr","articles\u002Fssr",{"title":50,"path":51,"stem":52},"同步 vs 非同步","\u002Farticles\u002Fsync-vs-async","articles\u002Fsync-vs-async",false,{"id":55,"title":30,"author":56,"body":60,"date":1023,"description":1024,"extension":1025,"externalUrl":1026,"image":1027,"meta":1028,"minRead":1029,"navigation":679,"path":31,"seo":1030,"stem":32,"__hash__":1031},"blog\u002Farticles\u002Fio-bound-vs-cpu-bound.md",{"name":57,"avatar":58},"Gary",{"src":59,"alt":57},"\u002Fimages\u002Fselfie.webp",{"type":61,"value":62,"toc":1014},"minimark",[63,68,76,136,142,145,149,152,246,249,265,268,275,277,281,288,299,348,355,365,367,371,374,518,528,535,658,691,740,742,746,761,767,770,775,778,783,786,824,826,830,833,881,884,1002,1004,1007,1010],[64,65,67],"h2",{"id":66},"什麼算-io","什麼算 I\u002FO",[69,70,71,75],"p",{},[72,73,74],"strong",{},"I\u002FO（Input\u002FOutput）"," 泛指程式跟外部世界交換資料的動作。任何資料要離開程式本身、跟外部裝置打交道，都算 I\u002FO：",[77,78,79,92],"table",{},[80,81,82],"thead",{},[83,84,85,89],"tr",{},[86,87,88],"th",{},"I\u002FO 類型",[86,90,91],{},"例子",[93,94,95,104,112,120,128],"tbody",{},[83,96,97,101],{},[98,99,100],"td",{},"網路 I\u002FO",[98,102,103],{},"發 HTTP 請求、收資料",[83,105,106,109],{},[98,107,108],{},"磁碟 I\u002FO",[98,110,111],{},"讀寫檔案、資料庫存取",[83,113,114,117],{},[98,115,116],{},"輸入裝置 I\u002FO",[98,118,119],{},"鍵盤、滑鼠、觸控",[83,121,122,125],{},[98,123,124],{},"輸出裝置 I\u002FO",[98,126,127],{},"螢幕顯示、印表機",[83,129,130,133],{},[98,131,132],{},"其他裝置 I\u002FO",[98,134,135],{},"相機、藍牙、感測器",[69,137,138,141],{},[72,139,140],{},"I\u002FO 密集（I\u002FO-bound）"," 不是指這些動作本身，而是指一個任務的耗時瓶頸主要卡在「等這些動作完成」，不是卡在運算。",[143,144],"hr",{},[64,146,148],{"id":147},"為什麼-io-是瓶頸速度差距是天文數字","為什麼 I\u002FO 是瓶頸：速度差距是天文數字",[69,150,151],{},"CPU 運算的速度，跟 I\u002FO 裝置的速度，差距懸殊：",[77,153,154,167],{},[80,155,156],{},[83,157,158,161,164],{},[86,159,160],{},"操作",[86,162,163],{},"大約耗時",[86,165,166],{},"相對 CPU 指令慢幾倍",[93,168,169,180,191,202,213,224,235],{},[83,170,171,174,177],{},[98,172,173],{},"CPU 執行一個指令週期",[98,175,176],{},"~0.3 奈秒",[98,178,179],{},"1x（基準）",[83,181,182,185,188],{},[98,183,184],{},"CPU Cache（L1）",[98,186,187],{},"~1 奈秒",[98,189,190],{},"3x",[83,192,193,196,199],{},[98,194,195],{},"RAM（記憶體）",[98,197,198],{},"50~100 奈秒",[98,200,201],{},"150~300x",[83,203,204,207,210],{},[98,205,206],{},"讀寫 SSD",[98,208,209],{},"~100 微秒",[98,211,212],{},"約 30 萬倍",[83,214,215,218,221],{},[98,216,217],{},"讀寫傳統硬碟（HDD）",[98,219,220],{},"5~10 毫秒",[98,222,223],{},"1500 萬倍以上",[83,225,226,229,232],{},[98,227,228],{},"網路請求（同機房）",[98,230,231],{},"~0.5 毫秒",[98,233,234],{},"約 50 萬倍",[83,236,237,240,243],{},[98,238,239],{},"網路請求（跨國）",[98,241,242],{},"100~300 毫秒",[98,244,245],{},"1~3 億倍",[69,247,248],{},"把 CPU 執行一個指令的時間放大成人類感受得到的「1 秒」：",[250,251,252,256,259,262],"ul",{},[253,254,255],"li",{},"存取 RAM ≈ 2.5~5 分鐘",[253,257,258],{},"讀寫 SSD ≈ 3.8 天",[253,260,261],{},"讀寫傳統硬碟 ≈ 1 年",[253,263,264],{},"網路請求（跨國）≈ 3~9 年",[69,266,267],{},"如果 CPU 傻傻等網路資料回來，等於讓一個工作能力超強的人站在原地，只為了等一封要好幾年才送到的信——這就是「I\u002FO 密集」瓶頸的真正含義：時間主要卡在 I\u002FO，不是卡在運算。",[69,269,270,271,274],{},"反過來，如果任務幾乎沒有等待外部資源，全部時間都是 CPU 在計算（加密、排序、影像處理），這種叫 ",[72,272,273],{},"CPU-bound（CPU 密集）","，瓶頸在運算能力，而不是等待。",[143,276],{},[64,278,280],{"id":279},"分界線畫在哪cpu-ram-不算-io","分界線畫在哪：CPU + RAM 不算 I\u002FO",[69,282,283,284,287],{},"「I\u002FO」的分界線不是「只要在 CPU 晶片外面就算」，而是看",[72,285,286],{},"存取方式","：",[289,290,295],"pre",{"className":291,"code":293,"language":294},[292],"language-text","CPU + RAM（核心運算資源，不算 I\u002FO）\n  ├─ 暫存器 \u002F Cache\n  └─ RAM：CPU 直接透過記憶體匯流排定址，不需要 OS 的 I\u002FO 子系統介入\n              │\n              │ 分界線\n              ▼\n外部裝置（才算 I\u002FO）\n  ├─ 硬碟 \u002F SSD、網路卡、鍵盤滑鼠、螢幕、USB 裝置……\n  └─ 都要透過 device driver、I\u002FO 控制器、系統呼叫才能存取\n","text",[296,297,293],"code",{"__ignoreMap":298},"",[77,300,301,313],{},[80,302,303],{},[83,304,305,307,310],{},[86,306],{},[86,308,309],{},"RAM",[86,311,312],{},"硬碟／網路（真正的 I\u002FO）",[93,314,315,326,337],{},[83,316,317,320,323],{},[98,318,319],{},"怎麼存取",[98,321,322],{},"CPU 直接定址，是每條指令自然的一部分",[98,324,325],{},"要透過 driver、系統呼叫、I\u002FO 控制器",[83,327,328,331,334],{},[98,329,330],{},"需不需要 OS 介入",[98,332,333],{},"不用",[98,335,336],{},"要，經過 kernel 的 I\u002FO 子系統",[83,338,339,342,345],{},[98,340,341],{},"能不能非同步處理",[98,343,344],{},"不行，是指令執行的內建延遲",[98,346,347],{},"可以，這正是 event loop／中斷機制發揮作用的地方",[69,349,350,351,354],{},"RAM 存取雖然比 CPU 運算慢 100~300 倍，但這個延遲是每條指令的正常開銷，程式無法、也不需要對它做非同步處理——沒有 ",[296,352,353],{},"await ram.read()"," 這種東西。真正需要 async 介入的，是慢上幾十萬倍、且時間不可預期的硬碟／網路 I\u002FO。",[356,357,358],"blockquote",{},[69,359,360,361,364],{},"「等待」不只 I\u002FO 一種類型，計時器、使用者互動、執行緒同步、硬體運算等待都算，完整分類可參考 ",[362,363,10],"a",{"href":11}," 一文。",[143,366],{},[64,368,370],{"id":369},"cpu-密集型任務async-幫不上忙","CPU 密集型任務：async 幫不上忙",[69,372,373],{},"Async 的本質是「反正在等外部東西，不如先做別的事」。但 CPU 密集型任務從頭到尾都是 CPU 自己在算，沒有等待的空檔可以利用：",[289,375,379],{"className":376,"code":377,"language":378,"meta":298,"style":298},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","async function heavyCompute() {\n  let result = 0\n  for (let i = 0; i \u003C 10_000_000_000; i++) {\n    result += Math.sqrt(i) \u002F\u002F 每一步都是 CPU 在算，沒有一刻在「等」\n  }\n  return result\n}\n","js",[296,380,381,404,421,467,497,503,512],{"__ignoreMap":298},[382,383,386,390,393,397,401],"span",{"class":384,"line":385},"line",1,[382,387,389],{"class":388},"spNyl","async",[382,391,392],{"class":388}," function",[382,394,396],{"class":395},"s2Zo4"," heavyCompute",[382,398,400],{"class":399},"sMK4o","()",[382,402,403],{"class":399}," {\n",[382,405,407,410,414,417],{"class":384,"line":406},2,[382,408,409],{"class":388},"  let",[382,411,413],{"class":412},"sTEyZ"," result",[382,415,416],{"class":399}," =",[382,418,420],{"class":419},"sbssI"," 0\n",[382,422,424,428,432,435,438,440,443,446,448,451,454,456,458,461,464],{"class":384,"line":423},3,[382,425,427],{"class":426},"s7zQu","  for",[382,429,431],{"class":430},"swJcz"," (",[382,433,434],{"class":388},"let",[382,436,437],{"class":412}," i",[382,439,416],{"class":399},[382,441,442],{"class":419}," 0",[382,444,445],{"class":399},";",[382,447,437],{"class":412},[382,449,450],{"class":399}," \u003C",[382,452,453],{"class":419}," 10_000_000_000",[382,455,445],{"class":399},[382,457,437],{"class":412},[382,459,460],{"class":399},"++",[382,462,463],{"class":430},") ",[382,465,466],{"class":399},"{\n",[382,468,470,473,476,479,482,485,488,491,493],{"class":384,"line":469},4,[382,471,472],{"class":412},"    result",[382,474,475],{"class":399}," +=",[382,477,478],{"class":412}," Math",[382,480,481],{"class":399},".",[382,483,484],{"class":395},"sqrt",[382,486,487],{"class":430},"(",[382,489,490],{"class":412},"i",[382,492,463],{"class":430},[382,494,496],{"class":495},"sHwdD","\u002F\u002F 每一步都是 CPU 在算，沒有一刻在「等」\n",[382,498,500],{"class":384,"line":499},5,[382,501,502],{"class":399},"  }\n",[382,504,506,509],{"class":384,"line":505},6,[382,507,508],{"class":426},"  return",[382,510,511],{"class":412}," result\n",[382,513,515],{"class":384,"line":514},7,[382,516,517],{"class":399},"}\n",[69,519,520,521,523,524,527],{},"就算包成 ",[296,522,389],{},"，執行時依然會獨占 CPU、卡住整條執行緒——不像 ",[296,525,526],{},"fetch"," 有個「送出去後、還沒回來」的空檔可以利用。",[69,529,530,531,534],{},"真正的解法是動用",[72,532,533],{},"平行運算","，讓計算在別的執行緒／行程跑：",[289,536,538],{"className":376,"code":537,"language":378,"meta":298,"style":298},"\u002F\u002F Web Worker：丟給另一條真正的執行緒去算，主執行緒完全不受影響\nconst worker = new Worker('heavy-compute.js')\nworker.postMessage('start')\nworker.onmessage = (e) => {\n  console.log('結果：', e.data)\n}\n",[296,539,540,545,576,597,622,654],{"__ignoreMap":298},[382,541,542],{"class":384,"line":385},[382,543,544],{"class":495},"\u002F\u002F Web Worker：丟給另一條真正的執行緒去算，主執行緒完全不受影響\n",[382,546,547,550,553,556,559,562,564,567,571,573],{"class":384,"line":406},[382,548,549],{"class":388},"const",[382,551,552],{"class":412}," worker ",[382,554,555],{"class":399},"=",[382,557,558],{"class":399}," new",[382,560,561],{"class":395}," Worker",[382,563,487],{"class":412},[382,565,566],{"class":399},"'",[382,568,570],{"class":569},"sfazB","heavy-compute.js",[382,572,566],{"class":399},[382,574,575],{"class":412},")\n",[382,577,578,581,583,586,588,590,593,595],{"class":384,"line":423},[382,579,580],{"class":412},"worker",[382,582,481],{"class":399},[382,584,585],{"class":395},"postMessage",[382,587,487],{"class":412},[382,589,566],{"class":399},[382,591,592],{"class":569},"start",[382,594,566],{"class":399},[382,596,575],{"class":412},[382,598,599,601,603,606,608,610,614,617,620],{"class":384,"line":469},[382,600,580],{"class":412},[382,602,481],{"class":399},[382,604,605],{"class":395},"onmessage",[382,607,416],{"class":399},[382,609,431],{"class":399},[382,611,613],{"class":612},"sHdIc","e",[382,615,616],{"class":399},")",[382,618,619],{"class":388}," =>",[382,621,403],{"class":399},[382,623,624,627,629,632,634,636,639,641,644,647,649,652],{"class":384,"line":499},[382,625,626],{"class":412},"  console",[382,628,481],{"class":399},[382,630,631],{"class":395},"log",[382,633,487],{"class":430},[382,635,566],{"class":399},[382,637,638],{"class":569},"結果：",[382,640,566],{"class":399},[382,642,643],{"class":399},",",[382,645,646],{"class":412}," e",[382,648,481],{"class":399},[382,650,651],{"class":412},"data",[382,653,575],{"class":430},[382,655,656],{"class":384,"line":505},[382,657,517],{"class":399},[289,659,663],{"className":660,"code":661,"language":662,"meta":298,"style":298},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Python：multiprocessing 開真正的行程平行運算\nfrom multiprocessing import Pool\n\nwith Pool(4) as p:\n    results = p.map(heavy_compute, data_list)\n","python",[296,664,665,670,675,681,686],{"__ignoreMap":298},[382,666,667],{"class":384,"line":385},[382,668,669],{},"# Python：multiprocessing 開真正的行程平行運算\n",[382,671,672],{"class":384,"line":406},[382,673,674],{},"from multiprocessing import Pool\n",[382,676,677],{"class":384,"line":423},[382,678,680],{"emptyLinePlaceholder":679},true,"\n",[382,682,683],{"class":384,"line":469},[382,684,685],{},"with Pool(4) as p:\n",[382,687,688],{"class":384,"line":499},[382,689,690],{},"    results = p.map(heavy_compute, data_list)\n",[77,692,693,705],{},[80,694,695],{},[83,696,697,699,702],{},[86,698],{},[86,700,701],{},"I\u002FO 密集",[86,703,704],{},"CPU 密集",[93,706,707,718,729],{},[83,708,709,712,715],{},[98,710,711],{},"瓶頸",[98,713,714],{},"等外部裝置回應",[98,716,717],{},"CPU 自己在算",[83,719,720,723,726],{},[98,721,722],{},"解法",[98,724,725],{},"Async \u002F 非阻塞 I\u002FO（單執行緒就夠）",[98,727,728],{},"真正的平行運算（多執行緒／多核心）",[83,730,731,734,737],{},[98,732,733],{},"能不能加速",[98,735,736],{},"Async 不會讓等待變快，但能讓 CPU 別閒置浪費",[98,738,739],{},"平行運算是真的能加速",[143,741],{},[64,743,745],{"id":744},"物理核心-vs-邏輯核心","物理核心 vs 邏輯核心",[69,747,748,749,752,753,756,757,760],{},"多數程式語言 API（如 ",[296,750,751],{},"os.cpus().length","）回傳的是",[72,754,755],{},"邏輯核心數","，跟真正的",[72,758,759],{},"物理核心數","不一定相等。",[289,762,765],{"className":763,"code":764,"language":294},[292],"1 個物理核心\n  └─ 若支援 Hyper-Threading \u002F SMT\n       → 偽裝成 2 個邏輯核心，讓 OS 誤以為有 2 個可排程單位\n       → 底層運算資源（ALU 等）仍是同一份，只是共用\n",[296,766,764],{"__ignoreMap":298},[69,768,769],{},"例如「4 核 8 緒」的 CPU：物理核心數 = 4，邏輯核心數 = 8。",[69,771,772],{},[72,773,774],{},"為什麼要搞邏輯核心：一條吃不滿，多開幾條榨乾資源",[69,776,777],{},"說白了：物理核心的運算資源，常常被一條執行緒吃不滿（因為它會等記憶體、等分支預測，中間有空檔），與其浪費，不如用 Hyper-Threading 多開一條邏輯核心，塞第二條執行緒進來填空檔，榨乾原本閒置的運算資源，換取約 15~30% 的額外效能。",[69,779,780],{},[72,781,782],{},"什麼時候邏輯核心沒有意義，甚至會拖慢",[69,784,785],{},"如果一條執行緒的工作本身就把核心資源用到滿（高度最佳化、緊密的數值運算迴圈），第一條執行緒就沒留下任何空檔，第二條邏輯執行緒插不進去。更糟的是，兩條邏輯執行緒共用同一份 Cache，如果都在瘋狂用 Cache，會互相把對方的內容擠掉（cache thrashing），實測效能可能反而下降 5~15%。這也是為什麼高效能運算（HPC）領域常直接在 BIOS 關掉 Hyper-Threading，讓執行緒數對齊物理核心數。",[77,787,788,798],{},[80,789,790],{},[83,791,792,795],{},[86,793,794],{},"任務類型",[86,796,797],{},"建議執行緒數",[93,799,800,808,816],{},[83,801,802,805],{},[98,803,804],{},"純 CPU 密集運算（緊密迴圈、數值計算）",[98,806,807],{},"貼近物理核心數",[83,809,810,813],{},[98,811,812],{},"一般應用程式（有分支、記憶體停頓）",[98,814,815],{},"邏輯核心數通常可以接受",[83,817,818,821],{},[98,819,820],{},"想要最保險",[98,822,823],{},"兩者都測試比較",[143,825],{},[64,827,829],{"id":828},"執行緒該開幾條對齊核心數不是越多越好","執行緒該開幾條：對齊核心數，不是越多越好",[69,831,832],{},"開多條執行緒的目的，是讓原本閒置的其他核心也動起來。但這裡有個常見誤解：",[77,834,835,847],{},[80,836,837],{},[83,838,839,841,844],{},[86,840],{},[86,842,843],{},"CPU 密集型任務",[86,845,846],{},"I\u002FO 密集型任務",[93,848,849,860,870],{},[83,850,851,854,857],{},[98,852,853],{},"執行緒在做什麼",[98,855,856],{},"一直在運算，真的佔用核心",[98,858,859],{},"大部分時間在等待（阻塞），不佔用 CPU",[83,861,862,864,867],{},[98,863,797],{},[98,865,866],{},"接近 CPU 核心數",[98,868,869],{},"可以遠超過核心數（開上千條也沒問題）",[83,871,872,875,878],{},[98,873,874],{},"開太多會怎樣",[98,876,877],{},"執行緒輪流搶核心（context switch），效能反而變差",[98,879,880],{},"大部分執行緒在「睡覺」等待，不會真的搶 CPU，開多一點沒差",[69,882,883],{},"邏輯核心數就是硬體「同一瞬間」真正能平行執行的指令流上限。超過這個數字的執行緒，並不會拿到更多平行運算資源，只是被作業系統用時間切片輪流分配，還多了 context switch 的額外成本——對 CPU 密集型任務是負優化，不是加分。",[289,885,887],{"className":376,"code":886,"language":378,"meta":298,"style":298},"\u002F\u002F Node.js：常見寫法是開跟 CPU 核心數一樣多的 Worker\nconst os = require('os')\nconst numCPUs = os.cpus().length\n\nfor (let i = 0; i \u003C numCPUs; i++) {\n  new Worker('heavy-compute.js')\n}\n",[296,888,889,894,917,941,945,981,998],{"__ignoreMap":298},[382,890,891],{"class":384,"line":385},[382,892,893],{"class":495},"\u002F\u002F Node.js：常見寫法是開跟 CPU 核心數一樣多的 Worker\n",[382,895,896,898,901,903,906,908,910,913,915],{"class":384,"line":406},[382,897,549],{"class":388},[382,899,900],{"class":412}," os ",[382,902,555],{"class":399},[382,904,905],{"class":395}," require",[382,907,487],{"class":412},[382,909,566],{"class":399},[382,911,912],{"class":569},"os",[382,914,566],{"class":399},[382,916,575],{"class":412},[382,918,919,921,924,926,929,931,934,936,938],{"class":384,"line":423},[382,920,549],{"class":388},[382,922,923],{"class":412}," numCPUs ",[382,925,555],{"class":399},[382,927,928],{"class":412}," os",[382,930,481],{"class":399},[382,932,933],{"class":395},"cpus",[382,935,400],{"class":412},[382,937,481],{"class":399},[382,939,940],{"class":412},"length\n",[382,942,943],{"class":384,"line":469},[382,944,680],{"emptyLinePlaceholder":679},[382,946,947,950,952,954,957,959,961,963,965,968,971,973,975,977,979],{"class":384,"line":499},[382,948,949],{"class":426},"for",[382,951,431],{"class":412},[382,953,434],{"class":388},[382,955,956],{"class":412}," i ",[382,958,555],{"class":399},[382,960,442],{"class":419},[382,962,445],{"class":399},[382,964,956],{"class":412},[382,966,967],{"class":399},"\u003C",[382,969,970],{"class":412}," numCPUs",[382,972,445],{"class":399},[382,974,437],{"class":412},[382,976,460],{"class":399},[382,978,463],{"class":412},[382,980,466],{"class":399},[382,982,983,986,988,990,992,994,996],{"class":384,"line":505},[382,984,985],{"class":399},"  new",[382,987,561],{"class":395},[382,989,487],{"class":430},[382,991,566],{"class":399},[382,993,570],{"class":569},[382,995,566],{"class":399},[382,997,575],{"class":430},[382,999,1000],{"class":384,"line":514},[382,1001,517],{"class":399},[143,1003],{},[64,1005,1006],{"id":1006},"結論",[69,1008,1009],{},"I\u002FO 之所以是瓶頸，是因為它跟 CPU 運算的速度差了好幾個數量級；分界線畫在 CPU + RAM 這個「核心運算資源」之外，才是 async 真正能發揮作用的範圍。CPU 密集型任務沒有這種等待空檔，async 幫不上忙，只能靠平行運算換取加速——而執行緒數該開多少，要看任務性質是在「等」還是在「算」：I\u002FO 密集可以遠超過核心數，CPU 密集則該貼近核心數（甚至是物理核心數），開太多不會更快，只會讓執行緒排隊搶用有限的硬體資源。",[1011,1012,1013],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":298,"searchDepth":406,"depth":406,"links":1015},[1016,1017,1018,1019,1020,1021,1022],{"id":66,"depth":406,"text":67},{"id":147,"depth":406,"text":148},{"id":279,"depth":406,"text":280},{"id":369,"depth":406,"text":370},{"id":744,"depth":406,"text":745},{"id":828,"depth":406,"text":829},{"id":1006,"depth":406,"text":1006},"2026-07-09","拆解 I\u002FO 為什麼是瓶頸、CPU\u002FRAM 與外部裝置的分界線、為什麼 CPU 密集任務用不上 async，以及執行緒數該對齊物理核心還是邏輯核心。","md",null,"\u002Fimages\u002Fdata-flow.jpg",{},8,{"title":30,"description":1024},"xBL4QeKvetEz7QFc_T8Tv-LFK--g_hUsuCsMM8oUPZU",[1033,1035],{"title":26,"path":27,"stem":28,"description":1034,"children":-1},"記錄將個人電商（GShop）部署到 GKE Autopilot 的完整流程。",{"title":34,"path":35,"stem":36,"description":1036,"children":-1},"從 Token、Context、Prompt，到 Tool、MCP、Agent，完整梳理 AI 應用開發的核心概念與底層運作原理。",1784010809711]