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.
Cevapla
#3
(12-09-2018, Saat: 08:10)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: 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.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#6
(12-09-2018, Saat: 11:05)uparlayan Adlı Kullanıcıdan Alıntı: 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.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
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

Örnek Link

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
  FireMonkey Resimlerde Pan ve Zoom İşlemleri TescilsizUzman 12 11.162 24-09-2019, Saat: 23:16
Son Yorum: engerex
  Object Model İle SQL İşlemleri Yaptırma witalihakko 5 5.604 02-03-2019, Saat: 12:39
Son Yorum: cexx
  SGK Evrak Doküman İşlemleri, Belge Gönderme csunguray 3 3.753 21-02-2018, Saat: 14:06
Son Yorum: csunguray



Konuyu Okuyanlar: 1 Ziyaretçi