Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Küçük Hızlandırma İşlemleri
#1
Merhaba, uygulama geliştirken karşılaştığım küçük hızlandırma ipuçlarını sizlerle paylaşıyorum. Sizde aklınıza gelenleri paylaşarak katkıda bulunabilirsiniz.

1-) Combobox gibi nesnelerde görsel değişikliği itemsları yüklemeden yapın.

var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Caption := '';
 Sure := Now;
 ComboTest.Style := TComboBoxStyle.csDropDownList;  // Eklemeden önce yaptık
 for Ind := 0 to 20000 do
 begin
   ComboTest.Items.Add(IntToStr(Ind));
 end;
 Caption := MilliSecondsBetween(now,Sure).ToString; // 1450 milli second
end;


var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Caption := '';
 Sure := Now;
 for Ind := 0 to 20000 do
 begin
   ComboTest.Items.Add(IntToStr(Ind));
 end;
 ComboTest.Style := TComboBoxStyle.csDropDownList;  // Eklemeden sonra yaptık
 Caption := MilliSecondsBetween(now,Sure).ToString; // 2062 milli second
end;


2-) Begin Update kullanın

var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Caption := '';
 Sure := Now;
 ComboTest.Items.BeginUpdate; //VCL için beginupdate ekledik
 for Ind := 0 to 20000 do
 begin
   ComboTest.Items.Add(IntToStr(Ind));
 end;
 ComboTest.Items.EndUpdate;
 Caption := MilliSecondsBetween(now,Sure).ToString; // 382 milli second
end;


var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Caption := '';
 Sure := Now;
 for Ind := 0 to 20000 do
 begin
   ComboTest.Items.Add(IntToStr(Ind));
 end;
 Caption := MilliSecondsBetween(now,Sure).ToString; // 1454 milli second
end;


3-) Dinamik nesne oluşturduğunuzda parentinin visible değerini false yapın

var
 xEdit : array of TEdit;
 Ind   : Integer;
 Sure  : TDateTime;
begin
 SetLength(xEdit,500);
 Sure := Now;
 for Ind := Low(xEdit) to High(xEdit) do
 begin
   xEdit[Ind] := TEdit.Create(PanelTest);
   xEdit[Ind].Parent := PanelTest;
 end;
 Caption := millisecondsbetween(Now,Sure).ToString; // 680 milli second
end;


var
 xEdit : array of TEdit;
 Ind   : Integer;
 Sure  : TDateTime;
begin
 SetLength(xEdit,500);
 Sure := Now;
 PanelTest.Visible := False;
 try
   for Ind := Low(xEdit) to High(xEdit) do
   begin
     xEdit[Ind] := TEdit.Create(PanelTest);
     xEdit[Ind].Parent := PanelTest;
   end;
 finally
   PanelTest.Visible := True;
 end;
 Caption := millisecondsbetween(Now,Sure).ToString; // 550 milli second
end;


4-) Items Bitiş değerini biliyorsanız Count kullanmayın

var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Sure := Now;
 for Ind := 0 to Pred(Memo1.Lines.Count) do // Count ile aldık
   Caption := Ind.ToString;
 Caption := MilliSecondsBetween(Now,Sure).ToString; // 638 milli second
end;


var
 Ind  : Integer;
 Sure : TDateTime;
begin
 Sure := Now;
 for Ind := 0 to 20000 do // Adet Girdik
   Caption := Ind.ToString;
 Caption := MilliSecondsBetween(Now,Sure).ToString; // 521 milli second
end;
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Merhaba,
Bence yazılım dilini öğrenmek, geliştirici olmaya yetmiyor. Her yazılımcı da maalesef geliştirici olamıyor. 
Yazılımcı=geliştirici değil mi zaten diyeceksiziniz; manaları farklı bana göre.
Zamanla kazanılan tecrübeler bizleri geliştirici yapıyor. 
Sizin paylaşmış olduğunuz tecrübe içerikli bu makale geliştirici olma sürecini daha da hızlandırıyor. 
Zaman ayırıp, bizlere katkıda bulunduğunuzdan dolayı teşekkür ederim.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
(12-09-2018, Saat: 08:10)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba,
Bence yazılım dilini öğrenmek, geliştirici olmaya yetmiyor. Her yazılımcı da maalesef geliştirici olamıyor. 
Yazılımcı=geliştirici değil mi zaten diyeceksiziniz; manaları farklı bana göre.
Zamanla kazanılan tecrübeler bizleri geliştirici yapıyor. 
Sizin paylaşmış olduğunuz tecrübe içerikli bu makale geliştirici olma sürecini daha da hızlandırıyor. 
Zaman ayırıp, bizlere katkıda bulunduğunuzdan dolayı teşekkür ederim.

Öncelikle teşekkür ederim Smile
Geçen dinamik nesnelerle oluşan bir formu hızlandırmam gerekiyordu benim bunları kalabalık kodda tespit etmem yarım günümü aldı ve bunlar %40 hız kazandırdı. Yazarken çok önem vermiyoruz zamanla şişiyor içerik.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#4
Test etmeden konuşmak belki yanlış ama bence; 4. maddedeki yavaşlığa asıl sebep, döngünün her değerinde Memo1.Lines.Count'un kontrol edilmesidir.
Bu değer döngüden önce bir değişkene atılırsa hem sizin kazandığınız hızı kazandırır hem de uygulamanız Lines.Count değişse de sorunsuz çalışır.
There's no place like 127.0.0.1
WWW
Cevapla
#5
Bazı nesneler "BeginUpdate" ve "EndUpdate" metodlarını sunabiliyor, döngülü bir işlemden önce "BeginUpdate" ve döngü bittikten sonra "EndUpdate" metodlarını çağırmak bariz bir hız farkına neden olabiliyor. TMemo ve DevExpress'in bir çok bileşeni buna örnek verilebilir.
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#6
(12-09-2018, Saat: 11:05)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bazı nesneler "BeginUpdate" ve "EndUpdate" metodlarını sunabiliyor, döngülü bir işlemden önce "BeginUpdate" ve döngü bittikten sonra "EndUpdate" metodlarını çağırmak bariz bir hız farkına neden olabiliyor. TMemo ve DevExpress'in bir çok bileşeni buna örnek verilebilir.

@uparlayan hocam birde şöyle bir olay var. Queryler de Locate ve Lookup'ı çok fazla kullanıyorum. İster istemez yavaşlıklara neden oluyor. Arama yaptığım alanlarda bazen Int iken bazen string oluyor. Locate veya Lookupa daha hızlı bir alternatifimiz var mı veya hızlandırılabilir mi? Nette araştırdığım kadarıyla bir alternatif bulamadım.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#7
Bu tür durumlarda daha çok SQL cümlesini dinamik oluşturma yoluna gidiyorum.
+ Eğer veri miktarı az ise dataset'in Filter / Filtered özellikleri de hızlı sonuç verebilir.
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#8
Valla benim bildiğim en hızlı yöntem hamallık yöntemi oluyor.

Tüm verileri bellekte record dizisine alıyorsun. İşin bitince değişenleri geri yazıyorsun.
En son küçük bir işimde denedim. Şimşek hızında çalışıyor maşallah!

Veya ADO'nun client cursor ve UpdateRecord özelliğini kullanarak test edip hızını ölçmek lazım.
Cevapla
#9
IndexDefs veya IndexFieldNames özelliğini dinamik olarak delphi tarafından oluşturabilirsiniz. Anahtar alanları doğru olarak burada tanımlamak bir miktar hız farkı oluşturacaktır.
Cevapla
#10
Konuya karşılaştığım bir sorun ile ilgili küçük bir eklemede bulunacağım;

Panelimin üzerinde dinamik create olan panel neslerim var. OnClick olayında kodlarım çalışıyor. Nedendir ki bir yavaşlık var. Birkaç saat optimizasyonla uğraşıyorum ve çok ilginçtirki bir durum görüyorum. Buna belki sizde şaşıracaksınız. Panelin Click olayı bir buton gibi çalışmıyor. Yani yavaş çalışıyor. Aşağıda bunun için size bir örnek yaptım inceleminizi isterim.

Form üzerinde 3 nesnem var 3ünde'de aynı kod çalışıyor. 1 buton 2 panel. 1 buton ve 1 panelin click olaylarında seri şekilde bastığımızda panelin çok ağır çalıştığını görüyoruz.

Aşağıda bir panelimiz daha var. Bu panelimizde aynı kod panelin OnDown eventinde yazılı. Aradaki hız farkını göreceksiniz. Down'a alarak olayı çözdüm fakat aklımada takıldı. Bu konuda bizi teknik olarak aydınlatabilecek arkadaş varsa minnettar olurum Smile

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

QLAp1V.png
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Object Model İle SQL İşlemleri Yaptırma witalihakko 5 1.746 02-03-2019, Saat: 12:39
Son Yorum: cexx
  FireMonkey Resimlerde Pan ve Zoom İşlemleri Fesih ARSLAN 11 2.774 16-04-2018, Saat: 12:04
Son Yorum: pro_imaj
  SGK Evrak Doküman İşlemleri, Belge Gönderme csunguray 3 1.087 21-02-2018, Saat: 14:06
Son Yorum: csunguray



Konuyu Okuyanlar: 1 Ziyaretçi