Untuk mengasumsikan peningkatan kecepatan karena segala bentuk multi-komputasi, Anda harus menganggap bahwa beberapa tugas berbasis CPU sedang dijalankan secara bersamaan pada beberapa sumber daya komputasi (umumnya inti prosesor) atau bahwa tidak semua tugas bergantung pada penggunaan bersamaan dari sumber daya yang sama - yaitu, beberapa tugas mungkin bergantung pada satu subkomponen sistem (misalnya penyimpanan disk) sementara beberapa tugas bergantung pada yang lain (menerima komunikasi dari perangkat periferal) dan yang lainnya mungkin memerlukan penggunaan inti prosesor.
Skenario pertama sering disebut sebagai pemrograman "paralel". Skenario kedua sering disebut sebagai pemrograman "konkuren" atau "asinkron", meskipun "konkuren" terkadang juga digunakan untuk merujuk pada kasus hanya mengizinkan sistem operasi untuk melakukan interleave eksekusi beberapa tugas, terlepas dari apakah eksekusi tersebut harus dilakukan tempatkan secara serial atau jika banyak sumber daya dapat digunakan untuk mencapai eksekusi paralel. Dalam kasus terakhir ini, "bersamaan" umumnya mengacu pada cara eksekusi ditulis dalam program, bukan dari perspektif simultanitas eksekusi tugas yang sebenarnya.
Sangat mudah untuk membicarakan semua ini dengan asumsi diam-diam. Misalnya, beberapa orang cepat membuat klaim seperti "Asynchronous I / O akan lebih cepat daripada I / O multi-threaded". Klaim ini meragukan karena beberapa alasan. Pertama, mungkin saja beberapa kerangka kerja I / O asinkron tertentu diimplementasikan secara tepat dengan multi-threading, dalam hal ini keduanya adalah satu konsep yang sama dan tidak masuk akal untuk mengatakan satu konsep "lebih cepat daripada" yang lain .
Kedua, bahkan dalam kasus ketika ada implementasi single-threaded dari framework asynchronous (seperti event loop single-threaded), Anda masih harus membuat asumsi tentang apa yang dilakukan loop tersebut. Misalnya, satu hal konyol yang dapat Anda lakukan dengan loop peristiwa single-threaded adalah memintanya untuk menyelesaikan dua tugas terikat CPU yang berbeda secara asinkron. Jika Anda melakukan ini pada mesin yang hanya memiliki inti prosesor tunggal yang ideal (mengabaikan pengoptimalan perangkat keras modern), maka melakukan tugas ini "secara asinkron" tidak akan benar-benar berfungsi dengan cara yang berbeda daripada menjalankannya dengan dua utas yang dikelola secara independen, atau hanya dengan satu proses - - perbedaannya mungkin terletak pada pengalihan konteks utas atau pengoptimalan jadwal sistem operasi, tetapi jika kedua tugas akan dikirim ke CPU, itu akan serupa dalam kedua kasus.
Berguna untuk membayangkan banyak kasus sudut yang tidak biasa atau bodoh yang mungkin Anda hadapi.
"Asynchronous" tidak harus serentak, misalnya seperti di atas: Anda "secara asinkron" menjalankan dua tugas yang terikat CPU pada mesin dengan tepat satu inti prosesor.
Eksekusi multi-utas tidak harus bersamaan: Anda menelurkan dua utas pada mesin dengan inti prosesor tunggal, atau meminta dua utas untuk memperoleh jenis sumber daya langka lainnya (bayangkan, katakanlah, basis data jaringan yang hanya dapat membuat satu koneksi pada satu waktu). Eksekusi utas mungkin disisipkan, namun penjadwal sistem operasi menganggapnya cocok, tetapi total runtime mereka tidak dapat dikurangi (dan akan ditingkatkan dari peralihan konteks utas) pada satu inti (atau lebih umum, jika Anda menelurkan lebih banyak utas daripada yang ada core untuk menjalankannya, atau memiliki lebih banyak utas yang meminta sumber daya daripada yang dapat dipertahankan sumber daya). Hal yang sama juga berlaku untuk multi-pemrosesan.
Jadi baik I / O asinkron maupun multi-threading tidak harus menawarkan peningkatan kinerja apa pun dalam hal waktu berjalan. Mereka bahkan bisa memperlambat segalanya.
Namun, jika Anda menentukan kasus penggunaan tertentu, seperti program tertentu yang membuat panggilan jaringan untuk mengambil data dari sumber daya yang terhubung ke jaringan seperti database jarak jauh dan juga melakukan beberapa komputasi terikat CPU lokal, Anda dapat mulai mempertimbangkannya. perbedaan kinerja antara kedua metode dengan asumsi tertentu tentang perangkat keras.
Pertanyaan untuk ditanyakan: Berapa banyak langkah komputasi yang perlu saya lakukan dan berapa banyak sistem sumber daya independen yang ada untuk melakukannya? Adakah subkumpulan dari langkah-langkah komputasi yang memerlukan penggunaan subkomponen sistem independen dan dapat mengambil manfaat dari melakukannya secara bersamaan? Berapa banyak inti prosesor yang saya miliki dan berapa biaya tambahan untuk menggunakan beberapa prosesor atau utas untuk menyelesaikan tugas pada inti terpisah?
Jika tugas Anda sangat bergantung pada subsistem independen, maka solusi asinkron mungkin bagus. Jika jumlah utas yang diperlukan untuk menanganinya akan banyak, sehingga peralihan konteks menjadi tidak sepele untuk sistem operasi, maka solusi asinkron beruntai tunggal mungkin lebih baik.
Setiap kali tugas terikat oleh sumber daya yang sama (misalnya beberapa kebutuhan untuk secara bersamaan mengakses jaringan atau sumber daya lokal yang sama), maka multi-threading mungkin akan menyebabkan overhead yang tidak memuaskan, dan sementara asinkron beruntai tunggal dapat menyebabkan lebih sedikit overhead, dalam sumber daya seperti itu- situasi terbatas itu juga tidak dapat menghasilkan percepatan. Dalam kasus seperti itu, satu-satunya pilihan (jika Anda ingin dipercepat) adalah membuat banyak salinan dari sumber daya tersebut tersedia (misalnya, beberapa inti prosesor jika sumber daya yang langka adalah CPU; database yang lebih baik yang mendukung lebih banyak koneksi bersamaan jika sumber daya langka adalah database dengan koneksi terbatas, dll.).
Cara lain untuk menjelaskannya adalah: mengizinkan sistem operasi untuk menyisipkan penggunaan sumber daya tunggal untuk dua tugas tidak bisa lebih cepat daripada hanya membiarkan satu tugas menggunakan sumber daya sementara yang lain menunggu, lalu membiarkan tugas kedua selesai secara berurutan. Selanjutnya, biaya penjadwal dari interleaving berarti dalam situasi nyata apa pun itu benar-benar menciptakan perlambatan. Tidak masalah jika penggunaan interleaved terjadi pada CPU, sumber daya jaringan, sumber daya memori, perangkat periferal, atau sumber daya sistem lainnya.