Apakah ada cara untuk menjalankan program C ++ lebih lambat dengan mengubah parameter OS apa pun di Linux? Dengan cara ini saya ingin mensimulasikan apa yang akan terjadi jika program tertentu tersebut berjalan pada mesin yang sangat lambat.
Dengan kata lain, mesin yang lebih cepat harus berperilaku sebagai mesin yang lebih lambat untuk program tersebut.
nice
adalah perintah yang menurunkan prioritas penjadwalan. Bervariasi kuno, relatif kasar. Anda dapat melihat prioritas penjadwalan, tetapi jika mesin tidak sibuk melakukan hal lain, program Anda akan tetap berjalan cepat. Jadi, itu mungkin tidak akan cukup membantu.Jawaban:
nice
(dan / ataurenice
). Anda juga dapat melakukannya secara terprogram menggunakannice()
panggilan sistem. Ini tidak akan memperlambat kecepatan eksekusi, tetapi akan membuat penjadwal Linux mengalokasikan kerangka waktu eksekusi yang lebih sedikit (dan mungkin lebih pendek), lebih sering melakukan preempt, dll. Lihat Penjadwalan Proses (Bab 10) dari Memahami Kernel Linux untuk detail lebih lanjut tentang penjadwalan .cpufreq-set
perintah.sched_yield()
, yang akan menghasilkan kuantum ke proses lain, dalam kinerja bagian penting dari program Anda (memerlukan perubahan kode).malloc()
,free()
,clock_gettime()
dll menggunakan LD_PRELOAD , dan melakukan beberapa hal konyol seperti membakar beberapa juta siklus CPU denganrep; hop;
, insert hambatan memori dll Hal ini akan memperlambat program pasti. (Lihat jawaban ini untuk contoh bagaimana melakukan beberapa hal ini).-O0
dan mengaktifkan pernyataan (yaitu-DDEBUG
).Semoga membantu.
sumber
-ggdb3
) tidak memperlambat eksekusi biner. Itu hanya membuatnya lebih besar.QEMU adalah emulator CPU untuk Linux. Debian memiliki paket untuk itu (saya kira kebanyakan distro akan melakukannya). Anda dapat menjalankan program di emulator dan kebanyakan dari mereka harus mendukung untuk memperlambat segalanya. Misalnya, Miroslav Novak memiliki tambalan untuk memperlambat QEMU.
Atau, Anda dapat mengkompilasi silang ke CPU-linux lain (arm-none-gnueabi-linux, dll) dan kemudian meminta QEMU menerjemahkan kode itu untuk dijalankan.
The bagus saran adalah sederhana dan dapat bekerja jika Anda menggabungkan dengan proses lain yang akan mengkonsumsi cpu.
Anda tidak mengatakan apakah Anda memerlukan grafik, file dan / atau jaringan I / O? Apakah Anda mengetahui sesuatu tentang kelas kesalahan yang Anda cari? Apakah ini kondisi balapan, atau apakah kode hanya berkinerja buruk di situs pelanggan?
Edit: Anda juga dapat menggunakan sinyal seperti STOP dan CONT untuk memulai dan menghentikan program Anda. Seorang debugger juga bisa melakukan ini. Masalahnya adalah kode berjalan dengan kecepatan penuh dan kemudian dihentikan. Sebagian besar solusi dengan penjadwal Linux akan mengalami masalah ini.
Ada semacam penganalisis benang dari Intel afair. Saya melihat Catatan Rilis Vtune . Ini Vtune, tapi saya cukup yakin ada alat lain untuk menganalisis balapan thread.Lihat: Intel Thread Checker , yang dapat memeriksa beberapa kondisi perlombaan thread. Tetapi kami tidak tahu apakah aplikasi tersebut multi-thread?sumber
Penggunaan
cpulimit
:Ada di repositori Ubuntu. Hanya
Berikut ini beberapa contoh tentang cara menggunakannya pada program yang sudah berjalan:
sumber
sumber
Jika Anda hanya ingin mensimulasikan program Anda untuk menganalisis perilakunya pada mesin yang sangat lambat, Anda dapat mencoba membuat seluruh program Anda berjalan sebagai
thread
program utama lainnya .Dengan cara ini Anda dapat memprioritaskan kode yang sama dengan prioritas berbeda di beberapa utas sekaligus dan mengumpulkan data analisis Anda. Saya telah menggunakan ini dalam pengembangan game untuk analisis pemrosesan bingkai.
sumber
Gunakan mode sleep atau tunggu di dalam kode Anda. Ini bukan cara terbaik untuk melakukannya, tetapi dapat diterima di semua jenis komputer dengan kecepatan berbeda.
sumber
Cara yang paling sederhana untuk melakukannya adalah dengan membungkus kode utama Anda yang dapat dijalankan dalam loop sementara dengan tidur di akhirnya.
Sebagai contoh:
Seperti yang orang akan sebutkan, ini bukan cara yang paling akurat, karena kode logika Anda masih akan berjalan dengan kecepatan normal tetapi dengan penundaan di antara proses. Juga, ini mengasumsikan bahwa kode logika Anda adalah sesuatu yang berjalan dalam satu putaran.
Tetapi ini sederhana dan dapat dikonfigurasi.
sumber