> Tutorial LeekScript
Disini kita akan membahas tentang optimasi, tujuan dari optimasi adalah untuk meningkatkan performa dari suatu algoritma. Secara umum, ketika kita berbicara tentang pengoptimalan, kita berbicara tentang waktu eksekusi, tujuannya adalah untuk mengurangi waktu yang diperlukan untuk mengeksekusi serangkaian instruksi.
Di LeekScript, waktu eksekusi ini diperkirakan dengan angka: jumlah operasi yang digunakan oleh perhitungan ini. Oleh karena itu, kami akan berbicara tentang praktik baik tertentu dan refleks yang baik untuk mengoptimalkan program, apa pun bahasanya, serta pengoptimalan tertentu yang lebih spesifik untuk LeekScript, dan terkait erat dengan cara penghitungan operasi.
Jika Anda belum melakukannya, saya mengundang Anda untuk membaca artikel LeekScript Tutorial: Operasi.
Misalnya, menyimpan 500 operasi pada fungsi yang dipanggil hanya sekali hanya akan menghemat 500 operasi. (logika) Di sisi lain, penghematan satu operasi, pada fungsi yang dipanggil dalam loop of loop of loop dapat mengurangi biaya operasi beberapa puluh ribu operasi.
Yang membawa saya ke poin kedua:
Setengah dari pekerjaan mengoptimalkan kode hanya terdiri dari mencari di mana operasi pergi (maka Anda harus berteriak keras dan menyuruh mereka kembali). Apa yang mahal dalam kode?
Untuk itu, bukan rahasia lagi, kami akan mengukur!
Di gudang kami, LeekScript menyediakan fungsi yang terbukti sangat berguna: getOperations. Fungsi ini memungkinkan untuk mengetahui jumlah operasi yang dihabiskan hingga sekarang dalam kode.
Contoh alat sederhana untuk mengukur biaya suatu fungsi:
operasi __debug_global; fungsi startOp(){ __debug_operation = getOperations(); } fungsi stopOp(judul){ biarkan ops = getOperations()-__debug_operation - 3; debug("Operasi (" + judul + "): " + operasi); }
startOp(); stopOp("tes kosong"); // tes kosong: 0
startOp(); say("halo dunia"); stopOp("halo dunia"); // halo dunia: 30
Dengan demikian kami dapat mengonfirmasi bahwa katakanlah biaya 30 operasi, seperti yang diumumkan oleh dokumentasi.
Itu mungkin, dan saya sangat menyarankan Anda membuat alat untuk mengukur hal-hal lain di AI Anda, seperti jumlah panggilan ke suatu fungsi, serta biaya rata-rata misalnya, yang akan mengukur evolusi biaya di AI Anda dengan lebih baik, dan dampak dari pengoptimalan tertentu.
Halaman Kompleksitas akan membantu Anda memahami mengapa suatu algoritme mahal dan cara menyelesaikan masalah. Untuk meringkas dengan sangat sederhana, kami lebih memilih untuk menghindari perulangan bersarang di antara mereka sejauh mungkin. Kami juga akan berusaha untuk membatasi ukuran loop kami, misalnya dengan menjelajahi hanya sel yang dapat diakses daripada menjelajahi semua sel di peta. Penting untuk dicatat bahwa algoritme yang memiliki kompleksitas lebih rendah akan menggunakan operasi * yang jauh lebih sedikit * untuk jumlah item yang cukup besar untuk diproses, pikirkan tentang itu sebelum mencoba mengorek pengoptimalan kecil !
Bayangkan kode berikut:
biarkan TP = getTP();
// tembak musuh sebanyak mungkin! untuk (var i = 0; i < lantai(TP / getWeaponCost(getWeapon())); i++) { useWeapon(getNearestEnemy()); }
Fungsi getNearestEnemy akan dipanggil pada setiap iterasi loop sementara itu akan selalu mengembalikan hasil yang sama! Untuk menghindarinya, cukup masukkan hasilnya ke dalam variabel sebelum fungsi. Kami melakukan hal yang sama untuk floor(TP / getWeaponCost(getWeapon())) yang juga dievaluasi pada setiap iterasi. Yang memberikan :
biarkan TP = getTP();
// tembak musuh sebanyak mungkin! var musuh = getNearestEnemy(); var nbShots = lantai(TP / getWeaponCost(getWeapon())); // jumlah kemungkinan tembakan dengan senjata saat ini untuk (var i = 0; i < nbShots; i++) { useWeapon(musuh); }
inArray, inArray praktis, ia melakukan apa yang kita inginkan, tetapi melibatkan biaya yang signifikan dalam operasi yang tidak perlu kita perhatikan pada pandangan pertama. Padahal, di dalamnya terlihat seperti ini:
fungsi inArray(elemen, larik){ untuk (nilai var dalam array) jika (nilai == item) kembali benar; kembali salah; }
Contoh ini adalah ilustrasi yang bagus untuk berbicara tentang sedikit kerumitan. Kita melihat di sini bahwa biaya sebenarnya dari fungsi ini bergantung pada kasus terburuk pada ukuran array array, yang akan kita beri nama n*. Oleh karena itu, fungsi ini memiliki kompleksitas *n
Impossible de charger les données du jeu.
Vérifiez votre connexion et réessayez.