September 16, 2009

Alıntı (canalpay):

>

Dediğim gibi ilk hangi fonksiyon çağrıldığı bile çok farkediyor hız ölçümünde. Hatta bazen biri hızlı olup diğeri yavaş oluyor. Bazen ise tam zıttı.

Hiç şaşırmadım... ;) Bunlar baştan tahmin edilmesi çok zor konulardır. Hatta daha yeni bir makale okudum: programa hız testi kodu eklenmesi, programı hızlandırıyordu. :)

Bu testlerin üçünü aynı programda yapmak yerine, teker teker yapmanı öneririm. Mikro işlemcinin ara belleğine sığıp sığmama gibi bir konu bile bir fonksiyonu diğerinden kat kat yavaş göşterebilir.

Dürüst olayım: bir fonksiyonun bir test programında daha hızlı olduğu ispatlansa bile, yine de gerçek programlar içindeki performansıyla aynı sonucu vermeyebilir.

Testlerin yapıldığı zamanda bilgisayarın başka hangi işlerle meşgul olduğu da performansı etkiler.

Eğer tutarlı olarak bir performans kazancı gösterilirse tamam. Ayrıca, bu sonuçlar üçünün de aynı hızda olduğunu göstermiyor mu:

Alıntı (canalpay):

>

birinci : 3578
ikinci : 3422
üçüncü : 3500

Ben bütün bildiklerime dayanarak, deney hataları nedeniyle farklı gibi görünen ama hızları aynı olan üç fonksiyon görüyorum.

Alıntı:

>

Ama switch yapısı itabarı ile ifden ayrılıyor. Bunu siz benden daha iyi biliyorsunuz. Switch bir anahtar kelime alır. Case ile anahtar terimi ne olduğunu kontrol eder ona göre işlem yaparsınız. SAdece bunun için tasarlandığı için hem daha hızlı olur. Hem de kod daha okunaklı olur. İflerde ise bir anahtar dan fazla alır. Bu yüzden daha yavaş çalışır. Böyle olmasa bile ben böyle biliyorum.

Doğru biliyorsun ama derleyicinin görevini azımsıyorsun. Derleyici, hız kazancı gördüğü için bizim if'imizi de arka planda switch olarak gerçekleştirebilir. Bu, antika derleyicilerin bile yıllardır bildikleri bir numaradır.

Alıntı:

>

Bu arada kodu tek kontrol ile yazıyorum. Bunun için switch yada if gerekmeyecek. Ama hata yapıyorum. Şuna bir bakarmısınız ?

> (büyükHarf == 'I') ? küçükHarf = 'ı' : küçükHarf = toUniLower(büyükHarf);
> ```

>

Şöyle olur herhalde:


küçükHarf = (büyükHarf == 'I') ? 'ı' : toUniLower(büyükHarf);



Bu kodun da bir karşılaştırma yaptığı açık herhalde? Nasıl olur da aynı işi yaptığı halde daha hızlı olabilir? ;)

Ek olarak, kullandığın deneme dizgisinde, yapılan işle ilgili her karakter de bulunmuyor. Örneğin ı yok...

Yine ek olarak, derleyiciyi -O seçeneğini kullanarak mı, kullanmadan mı çalıştırdın? Sonuçlar ona göre de farklılık gösterebilir.

Bunların hiçbirisini switch'e karşı olduğum için söylemiyorum. Hatta bence de burada switch daha uygun duruyor. Ama son derece önemli ve son derece yanıltıcı olan bir konuyu açtığın için bildiklerimi söylüyorum.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
September 16, 2009

Alıntı (canalpay):

>

Ama hocalarımdan bazıları nedenini bilmediğim halde Alpay der.

Bunu ben de geç öğrendim, kendim farketmemiştim: Türkiye'de günlük olan kullanılan orta isimdir. En azından bazı insanlar bunu böyle biliyorlar. Amerika'da ise ön isim günlük olarak kullanılır; orta isim yedek... Bu yüzden sıkıntı çeken Türkler tanıyorum.

Alıntı:

>

Bu arada ben de size aynı soruyu sormuştum.
Hatta kendimden alıntı yapıyorum:
Alıntı (canalpay):

>

Ali (bey, abi,hoca hangisini tercih edersiniz bilmiyorum.)

Ben herkese "sen" diye hitap ettiğim için başkalarının da yalnızca Ali demesini hiç yadırgamıyorum. Hatta Amerika'da ünvan diye bir şey olmadığı için alıştık da. (Amerikalıların bile şaşırdığı bir şekilde kızım da bana Ali der. :) ) Yani benim de bir seçimim yok...

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 16, 2009

Alıntı (canalpay):

>

Alıntı:

>

küçükHarf = (büyükHarf == 'I') ? 'ı' : toUniLower(büyükHarf);

Ama bunla switch hız açısından çok farkeder bence. Çünkü switchde ben gereksiz yere iki kontrol yapmıştım ama bir kontrol yetiyor sanırım. E ikinci kontrolün gereksiz olduğunu derleyici anlayabilir mi? anlayamaz.

Dediğim doğru çıktı. Birine 35 bin diyor diğerine 31 bin. aradaki fark oldukça fazla. Derleyici ne kadar akıllı olursa olsun benimle boy ölçüşemez :-D

switch'te yukarıda hissedildiği gibi iki case mi var? Çünkü madem iki kontrol gereksiz, onunkini de kaldırmak gerekir herhalde.

Alıntı:

>

Bu arada önerimi tekrar dile getiriyorum. Doğrusu susma hayır demek olur ama ben yinede siz hayır diyene kadar söyleyeceğim.
Alıntı (canalpay):

>

Bu arada bütün yazdığımız fonksiyonların hız testini yapalım mı ?

Bence bir sakıncası yok.

Alıntı:

>

Bu arada stringin yeni toupper_tr ile tolower_tr şeklini göndereyim mi ?

Eğer birim testlerden geçiyorsa, istediğin gibi gönderebilirsin. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 16, 2009

Alıntı (canalpay):

>

göndereyim mi ? Daha capitalize'yi yazmadım.

Gönder tabii. Hatta capitalize'ı yazmadan gönderirsen çok daha iyi olur.

Projeye yapılan eklerin olabildiğince küçük bir konuyla ilgili olması iyi olur. capitalize'ı sonra eklersen, onun da kendisine ait bir 'log message'ı olacaktır. Çok daha iyi...

Bir kural: "Commit early, commit often" ("geciktirmeden ve sık sık ekle").

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 16, 2009

Evet, ?: işleci daha hızlı kod üretiyor. Ama temelde ve genelde buna yardım eden hiçbir şey olmadığına göre, ben bunu dmd'nin bir garipliği olarak kabul etmek zorundayım. Çünkü sonuçta ?:, if, ve switch; bu fonksiyonda hep iki durumdan birisini seçmeye yarıyorlar. Derleyicinin üçü için aynı kod üretmesini beklerdim.

Bu fonksiyonu 7-8 kat hızlandırmanın başka yolları varken %3-4 hız kazancına bakmaya henüz sıra geldiğini düşünmemiştim. ;)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 16, 2009

Sorun, sonuç dizgisinin uzunluğunun '~=' ile adım adım arttırılmasından kaynaklanıyor. Dizginin şu andaki boyunun N olduğunu varsayarsak, ~= şöyle düşünüyor olabilir:

  • bende N+1 için yer yok
  • N+1'lik yer ayırayım
  • elimde bulunan N tane karakteri yeni yere kopyalayayım
  • verilen yeni karakteri de sonuna yazayım

O işlemler her karakter için tekrarlanıyor olabilir. (Aslında bir eniyileştirme de vardır belki ve akıllı olarak boyunu örneğin %75 arttırıyordur. Bilmiyorum.)

Şuna bir bak bakalım; fonksiyonun en başında bir kere:

çıkış.length = giriş.length;

O zaman çıkış için yeni yer ayırmaya hiç gerek kalmaz.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 17, 2009

Alıntı (acehreli):

>
  • bende N+1 için yer yok
  • N+1'lik yer ayırayım
  • elimde bulunan N tane karakteri yeni yere kopyalayayım
  • verilen yeni karakteri de sonuna yazayım

O işlemler her karakter için tekrarlanıyor olabilir. (Aslında bir eniyileştirme de vardır belki ve akıllı olarak boyunu örneğin %75 arttırıyordur. Bilmiyorum.)

Evet tamamen doğru tahmin etmişsiniz. Tek derleyici sandığınız kadar akıllı değilmiş. :-) toupper_tr fonksiyonunu 1 milyon kere çağırırken bencmark şablonunun verdiği değer 35(saniye oluyor galiba) bin olurken 9(saniyeye) bine düştü.

Evet gördüğümüz gibi derleyicide ne kadar iyi olursa olsun sizin yerinizi tutmuyor :-)


çıkış.length = giriş.length;

Evet ama bunun yanında başka şeylerde eklemek gerekiyor. mesala ~= işleci biliyorsunuz sonuna ekliyor. O yüzden direk hatalı oluyor. O yüzden foreach 'in başına int i, ekleyip ~= olan satırı ise

çıkış[i]=büyükHarf;

ile değiştirdim. Şimdi hız testli olarak yolluyorum. Daha nasıl hızlandırırız bakarsınız. Hız testi deneme dosyasında. Hız testine tek toupper_tr'yi ekledim . 9 saniye beklersiniz artık.
Alıntı (esatarslan52):

>

string.d içinde Türkçe karakterlerde sorun çıkartan başka fonksiyon varmı?

Eğer yapamadığım olursa size söylerim. Şimdilik uni.d'de if kontrolü yerine ? : kullansanız daha iyi. Hızın farkedeceğini pek sanmıyorum ama hem okunabilirlik artar. Hemde phobos kütüphanesinde bile ? : işleci kullanılıyor. Onlarında bildikleri bir şey vardır bence.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 17, 2009

capitalize fonksiyonu eklendi. 1 milyon kere çağrıldığında toupper'a göre 2 ile 3 saniye arasında yavaş çalışıyor. Ben açıkcası 1 ile 2 saniye arasında bir yavaşlama bekliyordum. Acaba kodları başka yerden çağırdığım için mi böyle oldu ? Ama derleyici aptal değil ya kodlar orada gibi iş yapar değil mi ? Yoksa yorumlanan diller hiç farkı kalmaz.

Şu dstring olayınıda iyiki yaptık. string devam etseydikde olurdu da yinede 10 satırdan daha az satırla yazdığım capitalize_tr fonksiyonunu kaç 30 satırda belki zor yazardım. Kod bakımı ve bana verdiği stres'te cabası.

Kodlara bakar daha nasıl hızlandırılır diye düşünürsünüz herhalde.

Konu Dışı

Alıntı (esatarslan52):

>

Daha önce bir makalede programcılar için müzik dinlemenin kod yazımında iyi olmadığını okumuştum. Derin ve ayrıntılı düşünmeyi engellediğinden bahsediyolardı. Yazıyı bulursam burda paylaşırım.

Evet olabilir hatta çoğu kişi ders çalışırken müzik dinler ama ben dinlemek istemem. Çünkü müzikle ders yapmaya alışınca müziksiz bir ortamda oldukça zorlanabiliyorsunuz yada en azından sınavda bir müzik dinlemek istiyor ve hafif dikatinizi bozuyor.(Gerçekten sınavlarda en ufak şey bile çok önemli. Dediklerimide sallamadım rehberlik servisinden öğrendim)

Ama programlamada benim için farklı. Derleyici hata verince hafif sinirleniyorum. Ama müzik insanın sinirini alıyor. Hatayı nerede yaptığınızı daha kolay buluyorsunuz. Birde bir anlığına can sıkıntısı yaşarsanız iki saniye kendinizi müziğe veriyorsunuz sonra tekrar kodlamaya dönüyorsunuz.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 17, 2009

Alıntı (wiki):

>

capwords:
s'nin bütün harfleri büyütülmüş, baştaki ve sondaki boşlukları silinmiş, ve aralardaki boşlukları tek boşluk karakteri ile değiştirilmiş olanını döndürür

Böyle yazıyor ama s'nin bütün harflerini büyültmüyor. Capitalize gibi ilk harfini büyütüyor. Hatta phobos kütüphanesinden stringinden capwords'a baktım ve orada da direk capitalize kullanıyor. Oraya acaba yanlış mı çevrilmiş. Bende phobos kütüphanesindeki gibi yapıyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 17, 2009

capwords fonksiyonunu phobos kütüphanesinden kopyalayıp yazdım. Şuan oldukça sağlam gözüküyor ama sonucu döndürürken bilmediğim bir işlemden geçiriyor. Hata verdiği için kaldırdım. Ama hata büyük ihtimalle fonksiyonun dahil olduğu modülü betiğe eklemediğim için oldu.

**Kısaca assumeUnique ne işe yarıyor ? **Galiba D'ye özel bir şey.

Siz cevap verene kadar yeni halini eklemiyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]