Google 建立的語言 Golang(或 Go)的主要優點之一是競爭管理,即能夠同時執行多個任務。
每種現代語言都有處理並發的工具。 Go 的與眾不同之處在於,運行時為我們抽象化了有關執行緒和並行性的大部分細節,這使得處理變得更加簡單。定義如何將 goroutine 指派給作業系統執行緒以及執行緒如何與可用 CPU 核心互動的是運行時,而不是作業系統核心。
開發人員可以在Go中同時使用並發(交錯執行)和並行(同時執行),甚至可以透過確定程式中同時執行緒的限制GOMAXPROCS屬性來明確地這樣做。所以Go可以將goroutine映射到多個核心以獲得真正的並行性,並且具有這種架構的機器正在處理。然而,預設情況下,運行時已經為我們進行了這種抽象。
import ( "runtime" ) func main() { runtime.GOMAXPROCS(4) // Permitir até 4 threads para paralelismo }
其他程式語言也提供並發和平行工具,但抽象程度和簡單性差異很大。例如,在 Java 中,我們有 Concurrent API (java.util.concurrent) 和 Thread、ExecutorService 和 ForkJoinPool 等工具來管理並行和平行性。
但是,開發者需要手動設定執行緒池或使用CompletableFuture等特定工具來簡化非同步操作。
Java 也允許使用執行緒池在多核心機器上並行執行。然而相較之下,Java 中的執行緒更重,因為它們直接對應到作業系統執行緒。
運行時 X 內核
作業系統執行緒由系統核心管理。這意味著創建、銷毀、上下文切換和管理執行緒是核心執行的任務,從而引入了額外的開銷。每個作業系統執行緒都會消耗大量記憶體(在 Java 中通常約為 1 MB)。當系統在執行緒之間切換時,需要保存和恢復處理器狀態(暫存器、堆疊等),這是一個昂貴的過程。
在 Go 中,是語言執行時期執行此管理。 Go 不會為每個 goroutine 建立作業系統線程。相反,Go 運行時在數量少得多的作業系統執行緒上管理多個 goroutine - 技術上稱為 M:N 調度(N 個執行緒上的 M 個 goroutine)。這允許
數千個具有相同線程數的 goroutine,而不會使作業系統過載。
這就是該語言的“恩典”,使其成為管理高效能分散式系統和即時資料處理應用程式的最愛。
但是,需要強調的是,任何現代語言都能夠處理並發和並行性。
差別在於亮度和加工成本。
這樣,我們就不需要停留在 FlaxFlu 語言中。每種語言都有其魔力、優點和缺點。
為了展示任何語言如何執行這些任務,我將在 Go 和 Java 中舉例說明同一程式是如何編碼的,每個程式都有自己的特殊性。這個想法很簡單:模擬以並行和並行執行的任務,並列印兩種情況下的執行時間和記憶體使用情況(每個機器的數字各不相同)。
為了讓比較更“豁免”,我讓chatgpt產生程式碼,如下:
戈蘭
import ( "runtime" ) func main() { runtime.GOMAXPROCS(4) // Permitir até 4 threads para paralelismo }
執行時間:141.886206ms
使用記憶體:43909120 位元組
爪哇
package main import ( "fmt" "runtime" "sync" "time" ) func tarefa(id int) { // Simula algum processamento leve time.Sleep(10 * time.Millisecond) } func main() { // Configura a quantidade de tarefas numTarefas := 100000 // Medindo o tempo de execução start := time.Now() var wg sync.WaitGroup wg.Add(numTarefas) // Calculando a quantidade de memória usada var m runtime.MemStats runtime.ReadMemStats(&m) initialMemory := m.Sys // Criando as goroutines para simular o trabalho for i := 0; i執行時間:10238 ms
使用記憶體:106732888 位元組無論如何,我們可以清楚地用兩種語言執行完全相同的任務。每個人都將他們的庫用於適當的目的。值得注意的是,Go 的執行速度提高了 98.61%,記憶體使用量減少了 58.86%。
但是沒有比另一種語言更好的了。
我們只需要了解每種語言的優缺點,然後選擇哪種語言可以幫助我們解決專案中遇到的問題。每個項目都有其需要解決的特定和獨特的問題。
Java 優化
當然,可以使用策略來嘗試提高上面提供的 Java 程式碼的效能。
我再次要求chatgpt將一些技巧融入初始程式碼:
import ( "runtime" ) func main() { runtime.GOMAXPROCS(4) // Permitir até 4 threads para paralelismo }為了減少記憶體消耗,我們使用了 ForkJoinPool,具有更多的線程數(100)以更好地處理高並發。這取代了預設的執行緒池,確保更多任務可以同時運行。我們也呼叫了submit和join來確保在結束程式之前所有任務都完成。
透過這些更改,記憶體分配減少了 56.21%:
執行時間:11877 ms
使用記憶體:46733064 位元組優化這段程式碼是一個有趣的挑戰。我們邀請您使用 Java 做得更好,這總是有可能的,因為我們知道,無論任何細節,這種語言都很棒。
以上是競爭與並行性:Golang 在這方面比 Java 表現更好嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文解釋了GO的軟件包導入機制:命名imports(例如導入“ fmt”)和空白導入(例如導入_ fmt; fmt;)。 命名導入使包裝內容可訪問,而空白導入僅執行t

本文詳細介紹了MySQL查詢結果的有效轉換為GO結構切片。 它強調使用數據庫/SQL的掃描方法來最佳性能,避免手動解析。 使用DB標籤和Robus的結構現場映射的最佳實踐

本文解釋了Beego的NewFlash()函數,用於Web應用程序中的頁間數據傳輸。 它專注於使用newflash()在控制器之間顯示臨時消息(成功,錯誤,警告),並利用會話機制。 Lima

本文演示了創建模擬和存根進行單元測試。 它強調使用接口,提供模擬實現的示例,並討論最佳實踐,例如保持模擬集中並使用斷言庫。 文章

本文探討了GO的仿製藥自定義類型約束。 它詳細介紹了界面如何定義通用功能的最低類型要求,從而改善了類型的安全性和代碼可重複使用性。 本文還討論了局限性和最佳實踐

本文詳細介紹了在GO中詳細介紹有效的文件,將OS.WriteFile(適用於小文件)與OS.openfile和緩衝寫入(最佳大型文件)進行比較。 它強調了使用延遲並檢查特定錯誤的可靠錯誤處理。

本文使用跟踪工具探討了GO應用程序執行流。 它討論了手冊和自動儀器技術,比較諸如Jaeger,Zipkin和Opentelemetry之類的工具,並突出顯示有效的數據可視化


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!