DAHA HIZLI ÇALIŞAN UYGULAMA GELİŞTİRMEK

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

DAHA HIZLI ÇALIŞAN UYGULAMA GELİŞTİRMEK

Mesaj gönderen PROGRAMADOR »

DAHA HIZLI ÇALIŞAN UYGULAMA GELİŞTİRMEK

Merhaba,

Bu yazıda Delphi ile kod yazarken hız konusunda dikkat edilmesi gereken hususlara değinmek istedim.

Maalesef delphi optimizasyon konusunda çok iyi sayılmaz. clang ve gcc delphi’nin çok ötesinde optimizasyon yapıyorlar. Bu nedenle mümkün mertebe yazdığımız koda özen göstermeliyiz.

Hızlı çalışan bir uygulama yazmak istiyorsak fonksiyon ve prosedürlerimize inline direktifini ekleyebiliriz. Hemen belirteyim ki inline direktifi fonksiyon ve prosedürün çağırıldığı yere otomatik olarak fonksiyonu alır. Aslında burada fonksiyon ya da prosedür çağırılmamakta text replace edilmektedir. Inline olmayan fonksiyonların çağırılması işlemin yapılmasını yavaşlatmaktadır. Bu nedenle inline fonksiyon ve prosedürler kullanılmasında yarar vardır. Ancak, inline fonksiyon ve prosedürler text replacement olduğu için kodun şişmesine de neden olmaktadır. Seçiminizi yapın: Hız mı, boyut mu?

Bununla birlikte x64 platformda program yazıyorsanız eğer fonksiyon ve prosedürlerinizin 4 parametreden fazla olmamasına dikkat edin. Çünkü ilk 4 parametre işlemci registerlerinden soldan sağa sırasıyla RCX, RDX, R8 ve R9’a kaydedilier. Doğrudan registerlarla işlem yapıldığı için hız konusunda bir hayli avantaj sağlamaktadır. 4’den fazla olan parametreler stack’e kaydedilecektir. Stack alanı RAM’de tutulduğu için registerlardan çok daha yavaş olacaktır. Peki diyelim ki fonksiyonunuz 4 parametreden fazla. Bu durumda ne yapabilirsiniz? Tabi ki record yapmalısınız. Fonksiyon parametreleriniz fazlasıyla mümkün mertebe parametreleri içinde barındıran bir record kullanın.

Mümkün mertebe global değişken kullanmayın. Diğer sakıncaları ayrı olmak üzere global değişkenlerin hız konusunda da olumsuz etkileri bulunuyor. Çünkü global değişkenler RAM’in stack bölgesinde yer almamaktadır. RAM’in en hızlı depolama alanı stack bölgesidir. Ayrıca değişkenlerinizi mümkün mertebe static olarak kullanmanızda hız bakımından fayda var.

Değişkenleri genelde local olarak prosedür ya da fonksiyonların var bölgesinde tanımlamakta fayda var. Çünkü local değişkenler RAM’in stack bölgesinde yer almaktadır. Ancak pointer değişkenler kullanılarak allocmem ya da getmem kullanılarak alan oluşturulacaksa bu alan heap bölgesinde yer alacaktır. Heap bölgesi stack bölgesine göre çok daha yavaştır. Programınızda stack bölgesinin fazla olması durumunda da stack alanınız yetmeyecektir. Gerçi stack alanını proje ayarlarından arttırabilirsiniz. Tabi ki sabit tanımlamanız mümkünse değişken tanımlamaktan kaçının.

Değişkenleriniz buna uygunsa mümkün mertebe SIMD kullanın. SIMD’nin anlamı Single Instruction, Multiple Data’dır. Yani Bir işlemle çoklu veri işleme anlamına geliyor. SSE2, AVX, AVX2 ve AVX512 SIMD’nin türleridir. SSE2 128 bit (16 byte), AVX-AVX2 256 bit (32 byte) ve AVX512 512 bit (64 byte) veriyi tek seferde hızlı bir şekilde işlemektedir. 64 bit işlemciler kural olarak tek seferde 64 bit (8 byte) veri işleyebilmekteyken SIMD ile bilgisayarınız sanki 128 bit, 256 bit ve 512 bit işlemcili bilgisayarmış gibi veri işleyebilirsiniz. Bunun için hazır kütüphaneler de var. Örneğin FastMM4 ve FastMM5. Tabi bu kütüphanelerin kullanımını iyi bilmekte fayda var.

Şayet çok kanallı uygulama yapıyorsanuz threadlerin fazla olması performansı önemli derecede düşürecektir. Birden fazla clientın bağlandığı bir serverda her client için bir thread oluşturursanız thread sayısı arttıkça server çalışamaz hale gelebilir. Bunun için thread oluşturulması gereken yerleri iyi seçmek gerekiyor.

Sonsuz döngülerde işlemcinin çalışma yoğunluğunun artması söz konusu olabilir. Hatta birden fazla thread söz konusu ise bu daha da çekilmez hale gelebilir. Bu sorunu Döngü içinde Sleep fonksiyonunu kullanarak halledebilirsiniz. 1 miliseconds thread’i uyutmanız yeterli dahi olabilecektir. Thread’e nefes aldırmakta fayda var.

Küçük stringler kullanıyorsanız eğer delphi’nin shortstring’ini kullanmanızı öneririm. Ayrıca stringlerde performans elde etmek istiyorsanız mümkün mertebe stack üzerinde stringlerinizi tanımlayın. Heap bölgesinde yer alan stringlerde sürekli işlem yapılırken stack’e göre önemli bir hız kaybı olmaktadır. Ancak daha önce de dediğim gibi stack bölgesinin şişmesi durumunda programınız hata verecektir. Bu durumda ya stack alanınızı arttıracaksınız, ya da değişkenlerinizi heap bölgesine almaya çalışacaksınız.

Faydası olması dileğiyle.

Hakan DİMDİK
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: DAHA HIZLI ÇALIŞAN UYGULAMA GELİŞTİRMEK

Mesaj gönderen mehmetantalya »

elinize saglik
PROGRAMADOR
Üye
Mesajlar: 239
Kayıt: 04 Oca 2008 01:53
Konum: Karşıyaka/İzmir

Re: DAHA HIZLI ÇALIŞAN UYGULAMA GELİŞTİRMEK

Mesaj gönderen PROGRAMADOR »

mehmetantalya yazdı: 28 Ara 2020 10:13 elinize saglik
Teşekkür ederim. Bir çırpıda aklıma gelenleri yazıverdim.
In dubio pro reo...
Şüpheden sanık/özgürlük yararlanır...
Cevapla