Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggantikan 0.1f dengan 0 Menghasilkan Peningkatan Prestasi 10x ganda dalam Kod Saya?
Pengaruh Nombor Titik Terapung Subnormal pada Prestasi
Dalam coretan kod yang disediakan, perubahan kecil yang kelihatan tidak ketara memberi kesan ketara kepada prestasi: perubahan 0.1f hingga 0 mengakibatkan kelembapan 10x. Perbezaan prestasi ini timbul daripada pengendalian nombor titik terapung subnormal (tidak normal).
Nombor subnormal ialah anggaran sifar, lebih kecil daripada nombor titik terapung biasa terkecil yang boleh diwakili. Ia selalunya terhasil daripada operasi yang menghasilkan nilai yang sangat kecil. Operasi pada nombor subnormal adalah sangat perlahan berbanding dengan operasi pada nombor titik terapung yang dinormalkan. Ini kerana banyak pemproses tidak mempunyai keupayaan untuk mengendalikan nombor subnormal secara langsung dan sebaliknya mesti menggunakan rutin mikrokod yang lebih perlahan.
Peperiksaan Berangka
Dua coretan kod, satu menggunakan 0.1 f dan yang lain menggunakan 0, menghasilkan output yang berbeza selepas lelaran berulang. Apabila menggunakan 0.1f, nilai menumpu kepada nilai bukan sifar hampir kepada sifar. Walau bagaimanapun, apabila menggunakan 0, nilai itu menumpu kepada sifar itu sendiri. Perbezaan dalam tingkah laku berangka ini menerangkan jurang prestasi.
Pembilasan Denormal
Untuk mengesahkan bahawa nombor subnormal bertanggungjawab terhadap perbezaan prestasi, kami boleh mengecilkannya kepada sifar dengan menambah baris berikut ke permulaan kod:
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
Ini mengarahkan pemproses untuk menganggap semua nombor subnormal sebagai sifar. Dengan pengubahsuaian ini, perbezaan prestasi antara menggunakan 0.1f dan 0 menjadi diabaikan. Ini mengesahkan bahawa nombor subnormal sememangnya punca kelembapan.
Kesimpulan
Dalam senario ini, mengelakkan penciptaan nombor subnormal dengan menggantikan 0.1f dengan 0 bertambah baik secara dramatik prestasi dengan menghalang pemproses daripada terlibat dalam rutin pengendalian nombor subnormal yang perlahan. Pengoptimuman ini berfungsi sebagai peringatan tentang kesan kadangkala memudaratkan nombor titik terapung yang tidak normal pada prestasi dan kepentingan mempertimbangkan potensi kehadirannya dalam pengiraan berangka.
Atas ialah kandungan terperinci Mengapa Menggantikan 0.1f dengan 0 Menghasilkan Peningkatan Prestasi 10x ganda dalam Kod Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!