Şurada yer alan duyuru (http://ddili.org/forum/thread/975) sayesinde GDC'nin davranışın daha akıllıca olduğunu gördüm...:)
Çünkü ilk iletimde bahsettiğim, switch()'in aralıklar ile kullanımda işlerin istemeyeceğimiz boyuta geldiğini görmüştük. Bunun GDC'de olmadığını öğrenmiş bulunmaktayım. Böylece yukarıdaki önerimi düzeltmek zorundayım! Eğer GDC veya DMD'nin yeni sürümlerini (bu test 2.060 ve öncesi için yapıldı!) kullanıyorsanız farklı durumlar olabilir. Örneğin GDC'nin ürettiği assembly kodu şu şekilde:
pushq %rbx
movl $64, %ebx
L59:
addl $1, %ebx
cmpb $65, %bl
jae .L62
L3:
testb %bl, %bl
jne .L59
xorl %eax, %eax
popq %rbx
ret
L62:
cmpb $90, %bl
jbe .L31
leal -97(%rbx), %eax
cmpb $25, %al
ja .L3
movzbl %bl, %esi
movl $.LC1, %edi
xorl %eax, %eax
call printf
jmp .L59
L31:
movzbl %bl, %esi
movl $.LC0, %edi
xorl %eax, %eax
call printf
jmp .L59
Gördüğünüz gibi herhangi bir look-up table olmadığı gibi, verdiğim aralıkların için de mi yoksa dışında mı olduğunu test ediyor. Aslında if()'li sürümü de çok benzer (ama aynı değil!) kod ürettiğini gördüm. Belki GDC'nin hızlı olduğu durumlar bu ve benzeri farklılıkların toplamı olsa gerek. Ne dersiniz?
Başarılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]