ホームページ バックエンド開発 Golang 競争と並列処理: この点で、Golang は Java よりも優れたパフォーマンスを発揮しますか?

競争と並列処理: この点で、Golang は Java よりも優れたパフォーマンスを発揮しますか?

Jan 05, 2025 am 07:30 AM

Concorrência e paralelismo: o Golang performa melhor que o Java nesse quesito?

Google が作成した言語である Golang (または Go) の主な利点の 1 つは、競争管理、つまり複数のタスクを同時に実行できることです。

現代の言語には、同時実行性に対処するツールが備わっています。 Go の特徴は、ランタイムがスレッドと並列処理に関する詳細のほとんどを抽象化し、この処理がはるかに単純になることです。オペレーティング システムのスレッドにゴルーチンを割り当てる方法と、スレッドが利用可能な CPU コアとどのように対話するかを定義するのは、オペレーティング システムのカーネルではなくランタイムです。

開発者は Go で同時実行 (インターリーブ実行) と並列処理 (同時実行) を同時に使用でき、プログラム内の同時スレッドの制限である GOMAXPROCS プロパティを決定することで明示的に使用することもできます。したがって、Go は複数のコアにゴルーチンをマッピングして実際の並列処理を実現し、このアーキテクチャを備えたマシンを処理できます。ただし、デフォルトでは、ランタイムがすでにこの抽象化を行っています。

import (
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(4) // Permitir até 4 threads para paralelismo
}

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

他のプログラミング言語も並行性と並列性のためのツールを提供していますが、抽象化と単純さのレベルは大きく異なります。たとえば、Java には、同時実行 API (java.util.concurrent) と、同時実行性と並列処理を管理するための Thread、ExecutorService、ForkJoinPool などのツールがあります。

ただし、開発者はスレッド プールを手動で構成するか、CompletableFuture などの特定のツールを使用して非同期操作を簡素化する必要があります。

Java では、スレッド プールを使用してマルチコア マシンでの並列実行も可能です。ただし、対照的に、Java のスレッドはオペレーティング システムのスレッドに直接マップされているため、より重くなります。

ランタイム X カーネル

オペレーティング システムのスレッドは、システム カーネルによって管理されます。これは、スレッドの作成、破棄、コンテキストの切り替え、および管理がカーネルによって実行されるタスクであることを意味し、追加のオーバーヘッドが発生します。各オペレーティング システム スレッドは、大量のメモリ (通常、Java では約 1 MB) を消費します。システムがスレッド間を切り替えるとき、プロセッサの状態 (レジスタ、スタックなど) を保存および復元する必要がありますが、これは高価なプロセスです。

Go では、この管理を行うのは言語ランタイムです。 Go は、ゴルーチンごとにオペレーティング システム スレッドを作成しません。代わりに、Go ランタイムは、はるかに少ない数のオペレーティング システム スレッドで複数のゴルーチンを管理します。技術的には M:N スケジューリング (N スレッド上の M ゴルーチン) と呼ばれます。これにより
が可能になります オペレーティング システムに過負荷をかけることなく、同じ数のスレッドを持つ何千もの 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 < numTarefas; i++ {
        go func(id int) {
            defer wg.Done()
            tarefa(id)
        }(i)
    }

    wg.Wait() // Espera todas as goroutines terminarem

    // Calculando o tempo total de execução e a memória usada
    elapsed := time.Since(start)
    runtime.ReadMemStats(&m)
    finalMemory := m.Sys

    // Printando os resultados
    fmt.Printf("Tempo de execução: %s\n", elapsed)
    fmt.Printf("Memória utilizada: %d bytes\n", finalMemory-initialMemory)
}

ログイン後にコピー

実行時間: 10238 ミリ秒
使用メモリ: 106732888 バイト

とにかく、両方の言語でまったく同じタスクを実行できることは明らかです。それぞれが適切な目的でライブラリを使用します。 Go では実行が 98.61% 高速になり、使用されるメモリが 58.86% 少なくなったことがわかります。

しかし、他の言語より優れた言語はありません。

必要なのは、プロジェクトで抱えている問題の解決に役立つ言語を選択する際に、それぞれの長所と短所を理解することです。そして、各プロジェクトには、解決する必要がある特定かつ固有の問題が山積しています。

Java での最適化

もちろん、Java で上記で提供されたコードのパフォーマンスを向上させる戦略を使用することも可能です。

私は chatgpt に、最初のコードにいくつかのトリックを組み込むよう再度依頼しました。

import (
    "runtime"
)

func main() {
    runtime.GOMAXPROCS(4) // Permitir até 4 threads para paralelismo
}

ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

メモリ消費を削減するために、より多くのスレッド (100) を備えた ForkJoinPool を使用して、高い同時実行性をより適切に処理します。これにより、デフォルトのスレッド プールが置き換えられ、より多くのタスクを同時に実行できるようになります。また、submit と join を呼び出して、プログラムを終了する前にすべてのタスクが完了していることを確認します。

これらの変更により、メモリ割り当てが 56.21% 削減されました:

実行時間: 11877 ミリ秒
使用メモリ: 46733064 バイト

このコードの最適化は興味深い課題です。 Java を使用してさらに改善することをお勧めします。この言語は、細部にかかわらず素晴らしいものであることはわかっているので、Java は常に可能です。

以上が競争と並列処理: この点で、Golang は Java よりも優れたパフォーマンスを発揮しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

Beego ormのモデルに関連付けられているデータベースを指定する方法は? Beego ormのモデルに関連付けられているデータベースを指定する方法は? Apr 02, 2025 pm 03:54 PM

Beegoormフレームワークでは、モデルに関連付けられているデータベースを指定する方法は?多くのBEEGOプロジェクトでは、複数のデータベースを同時に操作する必要があります。 Beegoを使用する場合...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

DebianでMongoDB自動拡張を構成する方法 DebianでMongoDB自動拡張を構成する方法 Apr 02, 2025 am 07:36 AM

この記事では、自動拡張を実現するためにDebianシステムでMongodbを構成する方法を紹介します。主な手順には、Mongodbレプリカセットとディスクスペース監視のセットアップが含まれます。 1。MongoDBのインストール最初に、MongoDBがDebianシステムにインストールされていることを確認してください。次のコマンドを使用してインストールします。sudoaptupdatesudoaptinstinstall-yymongodb-org2。mongodbレプリカセットMongodbレプリカセットの構成により、自動容量拡張を達成するための基礎となる高可用性とデータ冗長性が保証されます。 Mongodbサービスを開始:Sudosystemctlstartmongodsudosys

See all articles