Rumah >pembangunan bahagian belakang >C++ >Mengapa Menggantikan 0.1f dengan 0 Menghasilkan Peningkatan Prestasi 10x ganda dalam Kod Saya?

Mengapa Menggantikan 0.1f dengan 0 Menghasilkan Peningkatan Prestasi 10x ganda dalam Kod Saya?

DDD
DDDasal
2024-12-19 18:13:15264semak imbas

Why Does Replacing 0.1f with 0 Result in a 10x Performance Increase in My Code?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn