Özet:
Hesaplamanın en hızlı yolunu arıyorum
(int) x / (int) y
için bir istisna olmaksızın y==0
. Bunun yerine sadece keyfi bir sonuç istiyorum.
Arka fon:
Görüntü işleme algoritmalarını kodlarken genellikle bir (birikmiş) alfa değerine bölmem gerekir. En basit varyant, tamsayı aritmetiğine sahip düz C kodudur. Benim sorunum, ile sonuç pikselleri için genellikle sıfıra bölünme hatası almamdır alpha==0
. Ancak bu, sonucun hiç önemli olmadığı tam olarak piksellerdir: ile piksellerin renk değerleri umrumda değil alpha==0
.
Detaylar:
Şunun gibi bir şey arıyorum:
result = (y==0)? 0 : x/y;
veya
result = x / MAX( y, 1 );
x ve y pozitif tam sayılardır. Kod, iç içe geçmiş bir döngüde çok sayıda çalıştırılır, bu yüzden koşullu dallanmadan kurtulmanın bir yolunu arıyorum.
Y bayt aralığını aşmadığında, çözümden memnunum
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Ancak bu açıkça daha büyük aralıklar için pek işe yaramıyor.
Sanırım son soru şudur: 0'ı başka bir tamsayı değerine değiştirirken diğer tüm değerleri değiştirmeden bırakan en hızlı bit twiddling hack nedir?
Açıklamalar
Dallanmanın çok pahalı olduğundan% 100 emin değilim. Bununla birlikte, farklı derleyiciler kullanılıyor, bu yüzden küçük optimizasyonlarla kıyaslamayı tercih ediyorum (ki bu gerçekten sorgulanabilir).
Elbette, derleyiciler biraz karıştırmaya gelince harikadır, ancak C ile "umurumda değil" sonucunu ifade edemem, bu nedenle derleyici hiçbir zaman tüm optimizasyon yelpazesini kullanamayacaktır.
Kod tamamen C uyumlu olmalıdır, ana platformlar gcc & clang ve MacOS ile Linux 64 Bit'tir.
y += !y
? Bunu hesaplamak için şubeye gerek yok. Sen karşılaştırabilirsiniz x / (y + !y)
karşı x / max(y, 1)
belki de ve y ? (x/y) : 0
. En azından optimizasyonlar açıkken ikisinde de dal olmayacağını tahmin ediyorum.
0
bölümleri büyük ve bitişikse kabul edilebilir . Mikro optimizasyonlarla uğraşmak için bir yer var ve piksel başına işlemler tam olarak bu yer.