Rumah pembangunan bahagian belakang Golang Persaingan dan keselarian: adakah Golang berprestasi lebih baik daripada Java dalam hal ini?

Persaingan dan keselarian: adakah Golang berprestasi lebih baik daripada Java dalam hal ini?

Jan 05, 2025 am 07:30 AM

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

Salah satu kelebihan utama Golang (atau Go), bahasa yang dicipta oleh Google, ialah pengurusan pertandingan, iaitu keupayaan untuk menjalankan berbilang tugas pada masa yang sama.

Setiap bahasa moden mempunyai alat untuk menangani konkurensi. Apa yang membezakan Go ialah masa jalan mengabstraksi sebahagian besar butiran tentang benang dan keselarian untuk kami, yang menjadikan pemprosesan ini lebih mudah. Ia adalah masa jalan, bukan kernel sistem pengendalian, yang mentakrifkan cara goroutine diperuntukkan kepada urutan sistem pengendalian dan cara utas berinteraksi dengan teras CPU yang tersedia.

Pemaju boleh menggunakan concurrency (pelaksanaan berjalin) dan selari (pelaksanaan serentak) pada masa yang sama dalam Go Dan dia juga boleh melakukannya secara eksplisit dengan menentukan sifat GOMAXPROCS yang merupakan had urutan serentak dalam program. Jadi Go boleh memetakan goroutine pada berbilang teras untuk mendapatkan keselarian sebenar, dan mesin yang mempunyai seni bina ini dalam pemprosesan. Secara lalai, walau bagaimanapun, masa jalan sudah melakukan abstraksi ini untuk kita.

import (
    "runtime"
)

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

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Bahasa pengaturcaraan lain juga menawarkan alat untuk konkurensi dan keselarian, tetapi tahap abstraksi dan kesederhanaan sangat berbeza. Di Java, sebagai contoh, kami mempunyai API Serentak (java.util.concurrent) dan alatan seperti Thread, ExecutorService dan ForkJoinPool untuk mengurus concurrency dan parallelism.

Walau bagaimanapun, pembangun perlu mengkonfigurasi kumpulan benang secara manual atau menggunakan alatan tertentu seperti CompletableFuture untuk memudahkan operasi tak segerak.

Java juga membenarkan pelaksanaan selari pada mesin berbilang teras menggunakan kumpulan benang. Sebaliknya, walau bagaimanapun, benang dalam Java lebih berat kerana ia dipetakan terus ke urutan sistem pengendalian.

Runtime X Kernel

Benang sistem pengendalian diuruskan oleh kernel sistem. Ini bermakna mencipta, memusnahkan, menukar konteks dan mengurus benang ialah tugas yang dilakukan oleh kernel, memperkenalkan overhed tambahan. Setiap urutan sistem pengendalian menggunakan sejumlah besar memori (biasanya sekitar 1 MB dalam Java). Apabila sistem bertukar antara benang, ia perlu menyimpan dan memulihkan keadaan pemproses (pendaftaran, tindanan, dll.), yang merupakan proses yang mahal.

Dalam Go, masa jalan bahasa yang melakukan pengurusan ini. Go tidak mencipta urutan sistem pengendalian untuk setiap goroutine. Sebaliknya, masa jalanan Go mengurus berbilang goroutin pada bilangan urutan sistem pengendalian yang jauh lebih kecil - secara teknikal dipanggil penjadualan M:N (M goroutines pada benang N). Ini membolehkan
beribu-ribu goroutine dengan bilangan utas yang sama tanpa membebankan sistem pengendalian.

Dan ini adalah "rahmat" bahasa, menjadikannya kegemaran untuk mengurus sistem pengedaran berprestasi tinggi dan aplikasi pemprosesan data masa nyata.

Walau bagaimanapun, adalah penting untuk menekankan bahawa mana-mana bahasa moden mampu berfungsi dengan serentak dan selari.

Perbezaannya adalah pada tahap ringan dan kos pemprosesan.

Dengan cara ini, kita tidak perlu kekal dalam FlaxFlu bahasa. Setiap bahasa mempunyai keajaiban, kekuatan dan kelemahannya.

Hanya untuk menunjukkan cara mana-mana bahasa boleh melaksanakan tugasan ini, saya akan contohkan dalam Go dan Java bagaimana program yang sama dikodkan, masing-masing mempunyai keistimewaan tersendiri. Ideanya mudah: simulasikan tugasan yang dilakukan dengan serentak dan selari dan cetak masa pelaksanaan dan penggunaan memori dalam kedua-dua kes (nombor berbeza untuk setiap mesin).

Untuk menjadikan perbandingan lebih "dikecualikan", saya meminta chatgpt untuk menjana kod, seperti di bawah:

Golang

import (
    "runtime"
)

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

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Masa pelaksanaan: 141.886206ms
Memori yang digunakan: 43909120 bait

Jawa

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)
}

Salin selepas log masuk

Masa pelaksanaan: 10238 ms
Memori yang digunakan: 106732888 bait

Bagaimanapun, kami boleh melaksanakan tugas yang sama dengan jelas dalam kedua-dua bahasa. Masing-masing menggunakan perpustakaan mereka untuk tujuan yang sesuai. Adalah diperhatikan bahawa dalam Go pelaksanaan adalah 98.61% lebih pantas dan 58.86% kurang memori digunakan.

Tetapi tidak ada bahasa yang lebih baik daripada bahasa lain.

Apa yang kami perlukan ialah memahami kebaikan dan keburukan setiap satu apabila memilih bahasa yang boleh membantu kami menyelesaikan masalah yang kami hadapi dalam projek kami. Dan setiap projek akan mempunyai kumpulan masalah tertentu dan unik yang perlu diselesaikan.

Pengoptimuman di Jawa

Sudah tentu, anda boleh menggunakan strategi untuk cuba meningkatkan prestasi kod yang disediakan di atas dalam Java.

Saya meminta chatgpt sekali lagi untuk memasukkan beberapa helah ke dalam kod awal:

import (
    "runtime"
)

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

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk mengurangkan penggunaan ingatan, kami menggunakan ForkJoinPool, dengan bilangan utas yang lebih besar (100) untuk menangani kesesuaian yang tinggi dengan lebih baik. Ini menggantikan kumpulan benang lalai, memastikan lebih banyak tugas boleh dijalankan serentak. Kami juga memanggil hantar dan sertai untuk memastikan semua tugasan selesai sebelum menamatkan program.

Dengan perubahan ini, peruntukan memori telah dikurangkan sebanyak 56.21%:

Masa pelaksanaan: 11877 ms
Memori yang digunakan: 46733064 bait

Mengoptimumkan kod ini ialah satu cabaran yang menarik. Kami menjemput anda untuk melakukan yang lebih baik menggunakan Java, yang sentiasa sangat mungkin, kerana bahasa ini, kami tahu, hebat tanpa mengira sebarang butiran.

Atas ialah kandungan terperinci Persaingan dan keselarian: adakah Golang berprestasi lebih baik daripada Java dalam hal ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana cara menentukan pangkalan data yang berkaitan dengan model dalam beego orm? Bagaimana cara menentukan pangkalan data yang berkaitan dengan model dalam beego orm? Apr 02, 2025 pm 03:54 PM

Di bawah rangka kerja beegoorm, bagaimana untuk menentukan pangkalan data yang berkaitan dengan model? Banyak projek beego memerlukan pelbagai pangkalan data untuk dikendalikan secara serentak. Semasa menggunakan beego ...

Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Apr 02, 2025 am 09:12 AM

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apr 02, 2025 pm 05:09 PM

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Bagaimana menyelesaikan masalah penukaran jenis user_id semasa menggunakan aliran redis untuk melaksanakan beratur mesej dalam bahasa Go? Apr 02, 2025 pm 04:54 PM

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Cara mengkonfigurasi pengembangan automatik MongoDB pada Debian Apr 02, 2025 am 07:36 AM

Artikel ini memperkenalkan cara mengkonfigurasi MongoDB pada sistem Debian untuk mencapai pengembangan automatik. Langkah -langkah utama termasuk menubuhkan set replika MongoDB dan pemantauan ruang cakera. 1. Pemasangan MongoDB Pertama, pastikan MongoDB dipasang pada sistem Debian. Pasang menggunakan arahan berikut: SudoaptDateSudoaptInstall-ImongoDB-Org 2. Mengkonfigurasi set replika replika MongoDB MongoDB Set memastikan ketersediaan dan kelebihan data yang tinggi, yang merupakan asas untuk mencapai pengembangan kapasiti automatik. Mula MongoDB Service: sudosystemctlstartmongodsudosys

See all articles