Perbandingan kecepatan bahasa pemrograman menggunakan contoh pemecahan masalah pelatihan jaringan saraf

tujuan kerja


Bandingkan kecepatan program yang ditulis dalam berbagai bahasa dan berjalan pada sistem operasi yang berbeda. Hasil pekerjaan terutama menarik untuk memecahkan masalah yang terkait dengan jaringan saraf.

Besi dan OS


Untuk pengujian di Ubuntu dan Windows (laptop DELL Inspiron-7577):

RAM: 16Gb

CPU: Intel Core i7-7700HQ @ 8x 3.8GHz


ara. 1 (keluaran perintah screenfetch pada laptop DELL Inspiron-7577 di bawah Ubuntu OS )

Untuk pengujian di bawah MAC:

RAM: 8Gb

CPU: Intel Core i7 2.7GHz

Kami juga menguji Raspberry pi 4: 

RAM: 4Gb

CPU: ARMv7 rev 3 (v7l) @ 4x 1,5Ghz


ara. 2 (keluaran perintah screenfetch pada raspberry pi 4 )

Program pengujian


Untuk melakukan tes, sebuah program disimulasikan yang meniru jaringan 5 neuron, tujuan dari program ini adalah untuk belajar bagaimana menyelesaikan dengan benar masalah menemukan eksklusif atau dengan delta akurasi = 0,01. Semua parameter dan properti jaringan saraf, serta algoritma operasi dan pelatihan, diambil dari 2 pos ini:

https://habr.com/en/post/312450/

https://habr.com/en/post/313216/

Satu-satunya perubahan adalah dimasukkan dalam koefisien E (epsilon) - kecepatan belajar, α (alpha) - momen (E = 0,3, α = 0,5). Ketika menggunakan nilai-nilai yang ditunjukkan dalam artikel, jaringan saraf untuk waktu yang lama (8 jam) tidak dapat menemukan solusi.

Dengan strukturnya, program ini adalah semacam model OOP di mana kelas NeuronNet beroperasi dengan array objek dari kelas Neuron dan Sinaps. Objek kelas Sinaps berisi referensi ke 2 objek kelas Neuron. Untuk perhitungan floating point, tipe data ganda digunakan.

Algoritma Pengujian: 

  1. Objek kelas NeuronNet dibuat.
  2. Lulus satu set pelatihan ujian. Hasil pekerjaan jaringan saraf sebelum pelatihan dan setelah ditampilkan di konsol dan digunakan untuk perbandingan dengan yang referensi.
  3. Program ini memasuki siklus tanpa akhir di mana sekali dalam 100.000 hasil. Jika kesalahan kurang dari delta = 0,01, siklus tanpa akhir berakhir. Di masa depan saya akan menyebut setiap perbandingan semacam itu sebagai era. Ketika era berlalu, waktu yang dibutuhkan dan hasil perhitungan jaringan saraf untuk setiap nilai tabel yang mengecualikan atau ditampilkan di konsol.
  4. Setelah keluar dari siklus, program mencetak waktu yang telah berlalu dari 0 hingga era terakhir dan berakhir.

Program ini awalnya ditulis dalam python3 (https://gitlab.com/di.romanov/neuron1.git), dan kemudian diterjemahkan ke dalam Java, Kotlin, C ++ (gcc), php7, ruby


ara. 3 (contoh keluaran dari program yang ditulis dalam bahasa Kotlin yang berjalan di bawah OS Ubuntu)

Hasil tes


Ketika bekerja, program yang ditulis dalam Kotlin, Java, php, ruby, dan Python memberikan jawaban yang sama setelah set pelatihan, output setelah set pelatihan program yang ditulis dalam C ++ berbeda, yang mensyaratkan perubahan dalam jumlah zaman yang diperlukan untuk pelatihan yang tepat. Untuk alasan ini, baik perbandingan waktu berjalan seluruh program dan waktu yang dibutuhkan untuk melewati satu era akan diberikan.

Waktu Pelatihan [ms.]
UbuntuWindowsRaspbianMAC
Python104569204239521112335621
Kotlin49684877199637775
Jawa48925994179737652
Rubi7968490524457229
C ++100990212000505377
php75591131170513996

tab. 1 (waktu perjalanan semua era sebelum melatih jaringan saraf) 

Waktu perjalanan satu era [ms.]
UbuntuWindowsRaspbianMAC
Python8713169424331527576
Kotlin3924051631625
Jawa3954851434635
Rubi6667756638040
C ++4185883421057
php63811001243168

tab. 2 (waktu berlalu satu era) 

Analisis Hasil



grafik. 1 (waktu berlalunya semua era untuk program yang berjalan di OS Ubuntu)

Seperti yang diharapkan, Kotlin dan Java menunjukkan kecepatan kerja yang sama di depan Python sekitar 20 kali. Mari kita perhatikan beberapa pengamatan yang tidak begitu jelas.

Hasil dari program yang ditulis dalam C ++ tiba-tiba lambat. Sebagian, ini dapat dijelaskan oleh sejumlah besar era yang membawanya untuk menemukan jawaban yang tepat. Namun, bahkan dengan pemikiran ini ( lihat grafik. 2 ), ia tertinggal di belakang program Java dalam kecepatan. 


grafik. 2 (waktu berlalunya satu era untuk program yang berjalan pada Ubuntu OS)

Alasan lain untuk hasil tersebut mungkin berbeda penggunaan sumber daya prosesor ( lihat Gambar. 4, Gambar. 5 )


. 4 ( Ubuntu Kotlin)




ara. 5 (output monitor port Ubuntu selama pelaksanaan program yang ditulis dalam C ++)

Seperti yang Anda lihat, Java menggunakan setidaknya 4 core sekaligus, sedangkan program C ++ menggunakan satu. Namun, ini tidak dapat menjelaskan keunggulan kecepatan 8 kali, karena Java tidak menggunakan semua core hingga 100%.

Perbedaan signifikan dalam kecepatan program yang ditulis dalam Python tergantung pada OS. Saat menjalankan program Java pada sistem operasi yang berbeda, perbedaan kecepatan tidak lebih dari 40% (bahkan pada mesin yang berbeda, dengan pengecualian raspberry), tetapi ketika memulai program Python, nilai-nilai berikut diperoleh: Ubuntu - 104c, Windows - 204c, MAC - 335c . Rasio kecepatan program di Kotlin dengan kecepatan program di Python adalah 21 untuk OS Ubuntu, 26 untuk Raspberry dan sudah 43 untuk Mac.

Semua bahasa pemrograman yang ditafsirkan menunjukkan kecepatan yang sama pada Raspbery

Penulis Terjemahan Python3


Ruby, php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles