Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian · Pelajaran

Mengoptimumkan Kod Serentak

Pelajari teknik lanjutan untuk mengoptimumkan aplikasi Scala serentak, termasuk penalaan kumpulan utas dan mengelakkan pertikaian.

Pelajaran 3 daripada 310 langkah

Mengoptimumkan Kod Serentak ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 3 pelajaran.

Mengapa Mengoptimumkan Kod Serentak?

Mengoptimumkan kod Scala serentak amat penting untuk membina aplikasi berprestasi tinggi dan boleh diskalakan. Tujuannya adalah untuk menjadikan atur cara anda berjalan lebih pantas dan mengendalikan lebih banyak kerja secara serentak.

  • Throughput: Berapakah bilangan operasi yang boleh diselesaikan bagi setiap unit masa?
  • Kependaman: Berapa lamakah masa yang diperlukan untuk satu operasi?
  • Penggunaan Sumber: Adakah teras CPU dan memori anda digunakan dengan cekap?

Kod serentak yang tidak dioptimumkan dengan baik boleh menyebabkan hambatan, kebuntuan dan penggunaan sumber yang tidak cekap, sekali gus menghapuskan manfaat keserentakan.

Cara Kumpulan Jujukan Berfungsi

Kumpulan jujukan ialah kumpulan jujukan pekerja yang telah dimulakan terlebih dahulu dan boleh digunakan semula untuk melaksanakan tugasan. Daripada mencipta jujukan baharu untuk setiap tugasan, yang memerlukan kos tinggi, tugasan dihantar kepada kumpulan tersebut.

Ini mengurangkan overhed penciptaan dan pemusnahan jujukan, meningkatkan ketanggapan dan membantu mengurus bilangan jujukan aktif bagi mengelakkan kehabisan sumber.

Konfigurasikan Kumpulan Global Scala

Dalam Scala, operasi tak segerak sering menggunakan ExecutionContext. Secara lalai, aplikasi Scala menggunakan ExecutionContext global yang biasanya merupakan ForkJoinPool.

Anda boleh menala kumpulan lalai ini dengan mengkonfigurasi sifat sistem atau, lebih lazimnya, dengan mentakrifkan tetapan penghantar dalam application.conf (terutamanya dalam aplikasi berasaskan Akka). Ini membolehkan anda mengawal bilangan jujukan, tingkah laku pencurian kerja dan saiz baris gilir.

Tetapan biasa yang boleh dilaraskan ialah parallelism-factor untuk menskalakan saiz kumpulan berbanding teras CPU yang tersedia.

Cipta ExecutionContexts Tersuai

Walaupun ExecutionContext global mudah digunakan, selalunya lebih baik untuk mencipta kumpulan jujukan tersuai bagi jenis tugasan yang berbeza. Contohnya, kumpulan kecil untuk tugasan terikat CPU dan kumpulan yang lebih besar untuk tugasan terikat I/O.

Ini menghalang operasi I/O yang perlahan daripada menyekat tugasan terikat CPU, sekali gus meningkatkan ketanggapan keseluruhan sistem. Berikut ialah cara mencipta ExecutionContext tersuai yang mudah:

import java.util.concurrent.{Executors, ExecutorService}
import scala.concurrent.ExecutionContext

object CustomPoolExample {
  def main(args: Array[String]): Unit = {
    // Create a fixed thread pool with 4 threads
    val customExecutor: ExecutorService =
      Executors.newFixedThreadPool(4)

    // Wrap it in a Scala ExecutionContext
    implicit val customEC: ExecutionContext =
      ExecutionContext.fromExecutor(customExecutor)

    println("Custom ExecutionContext created.")

    // Don't forget to shut down the executor!
    customExecutor.shutdown()
  }
}

Minimumkan Perebutan Sumber

Perebutan berlaku apabila beberapa jujukan cuba mengakses sumber dikongsi (seperti pemboleh ubah, struktur data atau sambungan pangkalan data) pada masa yang sama, lalu satu atau lebih jujukan terpaksa menunggu.

Penantian ini memperkenalkan kelewatan dan overhed kerana jujukan bersaing untuk mendapatkan kunci dan kitaran CPU. Perebutan yang tinggi boleh merendahkan prestasi aplikasi serentak dengan teruk, walaupun banyak teras CPU tersedia.

Strategi untuk mengurangkan perebutan penting bagi mencapai keselarian sebenar.

Penguncian Berbutir Halus

Daripada menggunakan satu kunci berbutir kasar untuk melindungi keseluruhan objek atau blok kod yang besar, penguncian berbutir halus menggunakan kunci yang lebih kecil dan khusus untuk melindungi hanya bahagian data yang sebenarnya diubah.

Ini membolehkan bahagian objek yang berbeza diakses secara serentak oleh jujukan yang berbeza, sekali gus mengurangkan perebutan dengan ketara. Namun begitu, kaedah ini juga meningkatkan kerumitan dan risiko kebuntuan jika tidak diurus dengan teliti.

class Counter {
  private var value = 0
  private val lock = new Object() // A specific lock for 'value'

  def increment(): Unit = lock.synchronized {
    value += 1
  }

  def get(): Int = lock.synchronized {
    value
  }
}

object FineGrainedLocking {
  def main(args: Array[String]): Unit = {
    val counter = new Counter()
    println(s"Initial counter value: ${counter.get()}")
    counter.increment()
    println(s"Incremented value: ${counter.get()}")
  }
}

Operasi Atom untuk Prestasi

Struktur data tanpa kunci menggunakan operasi atom aras rendah (seperti Compare-And-Swap, CAS) untuk mengemas kini pemboleh ubah dikongsi tanpa kunci eksplisit. Ini mengelakkan overhed dan potensi perebutan yang berkaitan dengan mekanisme penguncian tradisional.

Scala memanfaatkan pakej Java java.util.concurrent.atomic untuk tujuan ini. Kelas seperti AtomicInteger, AtomicLong dan AtomicReference menyediakan kemas kini atom, menjadikannya sesuai untuk senario dengan perebutan tinggi.

import java.util.concurrent.atomic.AtomicInteger

object AtomicCounterExample {
  def main(args: Array[String]): Unit = {
    val atomicCounter = new AtomicInteger(0)

    // Increment the counter atomically
    atomicCounter.incrementAndGet()
    println(s"Atomic counter after increment: ${atomicCounter.get()}")

    // Another atomic operation: add 5
    atomicCounter.addAndGet(5)
    println(s"Atomic counter after adding 5: ${atomicCounter.get()}")
  }
}

Ukur Prestasi dengan Tepat

Untuk benar-benar mengetahui sama ada pengoptimuman serentak anda berkesan, anda mesti mengukurnya dengan tepat. Pengukuran masa mudah menggunakan System.nanoTime() selalunya tidak mencukupi untuk kod serentak kerana pengoptimuman JVM, tempoh pemanasan dan pertukaran konteks.

Alatan penanda aras profesional seperti JMH (Java Microbenchmark Harness) direka untuk tujuan ini. Alatan ini mengendalikan pemanasan JVM, penghapusan kod mati dan menyediakan analisis statistik, lalu memberikan metrik prestasi yang boleh dipercayai untuk algoritma serentak anda.

Fokus pada metrik seperti operasi sesaat (throughput) dan purata masa pelaksanaan (kependaman) di bawah keadaan beban yang berbeza.

Semakan Pengoptimuman Keserentakan

Antara berikut, yang manakah strategi berkesan untuk mengoptimumkan aplikasi Scala serentak dan mengurangkan perebutan?

Imbas Kembali: Prestasi Serentak yang Lebih Baik

Dalam pelajaran ini, kami meneroka teknik lanjutan untuk mengoptimumkan aplikasi Scala serentak:

  • Kami mempelajari kepentingan penalaan kumpulan jujukan, termasuk mengkonfigurasi ExecutionContext lalai Scala dan mencipta kumpulan tersuai untuk jenis tugasan tertentu.
  • Kami membincangkan strategi untuk mengelakkan perebutan, seperti mengurangkan kehalusan kunci melalui penguncian berbutir halus.
  • Kami melihat cara struktur data tanpa kunci, khususnya pemboleh ubah atom, dapat menyediakan kemas kini keadaan dikongsi yang cekap dan mempunyai overhed rendah.

Ingat, sentiasa ukur kesan pengoptimuman anda dengan alatan penanda aras yang betul untuk memastikan peningkatan prestasi sebenar!

Percuma untuk bermula

Pelajari Scala dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
143

Soalan Lazim

Adakah pelajaran “Mengoptimumkan Kod Serentak” percuma?

Ya — teks penuh “Mengoptimumkan Kod Serentak” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Mengoptimumkan Kod Serentak”?

Pelajari teknik lanjutan untuk mengoptimumkan aplikasi Scala serentak, termasuk penalaan kumpulan utas dan mengelakkan pertikaian. Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.

Berapa lamakah pelajaran “Mengoptimumkan Kod Serentak” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?

Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pembuatan Profil Aplikasi Scala
  2. Pengurusan Memori & Penalaan GC
  3. Mengoptimumkan Kod Serentak
← Kembali ke Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian