Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: 1 [2]   Aşağı git
Yazdır
Gönderen Konu: Döngüler Neden Yavaş?  (Okunma Sayısı 11164 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
ibo1973
Uzman
*****
Mesaj Sayısı: 2.497


Üyelik Bilgileri
« Yanıtla #15 : Şubat 16, 2019, 08:08:03 ÖÖ »

Evet arkadaşlar uzun bir ara oldu konu açılalı ama demek istediğim şey tam olarak şuydu; arkadaşlar tek satırlık bir kod yazıp denemiş aynısını ben de yaptım doğru 1 sn bile sürmedi ancak benim ekteki kodları biraz incelerseniz daha iyi olur kodların çıktısı da ekteki excel dosyasında var.

Kısaca kodların ne yaptığını anlatayım SQL Server veritabanında kayıtlı olan müşterilerin güncel borç - alacak ve kalan bakiyesini çekiyor sistemde kayıtlı sadece 360 müşteri var ilk for döngüsü 360 a kadar sayıyor yani müşteri sayısı artarsa değişiyor tabi güncel rakama göre diğer iç döngü ise müşteriyle yapılan borç alacak hareketlerini çekiyor bu döngü sayısıda müşteriyle yapılan işleme göre değişiyor.
Bu bilgileri düzgün ve formatlı bir biçimde renklendirerek, fontunu ayarlayarak, yazı tipini ve boyutunu belirleyip, arkplan rengini belirleyip, gerekli hücreleri daraltıp veya genişletip, gerekli hücreleri birleştirip, yazı hizalamasını sağa veya sola göre ayarlayıp, düzgün bir excel dosyası çıktısı oluşturuyor ekteki örneğe bakabilirsiniz.

Ben size sadece örnek bir excel çıktısı gönderdim yaklaşık 200 satır ve 5 müşterinin hesap bilgileri var ama bu bilgileri excele yazması yaklaşık 10 sn sürdü sistemdeki tüm müşterilerin hesaplarını bu şekilde yazdırdığımızda bizi bekletiyor tabi bilgisayarın gücüne göre de değişmekle birlikte 5 - 10 dk kadar falan bekliyoruz tabi çok uzun bir süre değil ancak yine de sinir bozucu müşteri sayısı 2000 - 5000 olan firmalar aynı raporu bunlarda isterse şayet o zaman adamlar 1 saat mi bekleyecek nasıl çözebiliriz kodları biraz inceleyin bazı gereksiz kodlar var onlara takılmayın arayüzle ilgili.
Asıl işlemler döngülerde yapılıyor her hücrenin içindeki değeri yazı tipi yazı rengi genişliği arkaplan rengi vs belirleniyor tabi bu da iş yükünü artırıyor ama çıktıyı bu şekilde isteyen müşteri biz değil yapacak bir şey yok bu şekilde istiyorlarsa bekleyecekler o zaman ya da sizin önerdiğiniz bir yöntem var mı?

programı döngüye sokarak kontrol ettiğin için bu işlem çok yavaş döngüye sokmaman lazım programı akışına bırakman en doğrusu.

yok ben anlamam öyle işlerden dersen illada döngüye sokacaksan ozaman carileri ni kontrol ettiğin mişterilerinin  sonun cusunu örneğin son adlı bir müşteri oluştur bu son adlı müşteriyi okuduğunda döngüden çıksın program.

Logged
NoStres
Deneyimli
*****
Mesaj Sayısı: 633


One Love, One Heart, One Destiny


Üyelik Bilgileri WWW
« Yanıtla #16 : Şubat 16, 2019, 15:56:16 ÖS »

Selam programcı42 hemşerim,

Progressbar'ı iptal et; veya kodlarla %'lere böl %10, %20 gibi...
Logged

amenofis
Üye
**
Mesaj Sayısı: 48


Üyelik Bilgileri
« Yanıtla #17 : Şubat 16, 2019, 16:07:53 ÖS »

Aslında kodları görseydik daha iyi fikir yürütürdük. Muhtemelen çalışma süresinin %99'unu hazır framework kodları oluşturuyordur. Yani sizin yapabileceğiniz pek birşey yok gibi.
Logged
programci42
Üye
***
Mesaj Sayısı: 210


Üyelik Bilgileri
« Yanıtla #18 : Şubat 19, 2019, 00:38:24 ÖÖ »

Kodları Ekte verdim aslında zip içinde hem kodlar hem de örnek çıktı excel belgesi var.
Progressbarı takip etmek için koydum ne kadar kaldığını bilelim diye çok kısa süreceğini bilsem iptal ederim zaten ama dakikalarca beklettiği için koydum bir de programı ben değil müşteri kullanıyor adam görsün yani en azından program yanıt vermiyora düşünce kitlenip kaldı zannedip görevi sonlandırmasın diye.

Zip arşivi mesajın ekine tekrar koydum oradan bakabilirsiniz.

Peki bir şey soracağım ekran kartlarının işlemcisi anakarttaki işlemcilerden daha güçlü değil mi öyleyse bu hesaplamayı ekran kartına nasıl yaptırtabilirim?

Veya işi ikiye bölsem iki kanal thread açsam nasıl olur ya da olur mu yani diyelimki sistemde 500 müşteri var 2 ye böldük 250 müşteri hesabı exceldeki sayfa 1 e yazılıyor başka bir kanalda aynı anda başka bir kanalda sayfa 2 ye geriye kalan müşteri hesapları yazılıyor bu yöntem süreyi biraz daha kısaltabilir mi?

* ORNEK.zip (15.93 KB - Yükleme: 149 kez.)
Logged
wizofwor
Genel Yönetici
*****
Mesaj Sayısı: 4.780


Gosub ile gidilen yerden goto ile dönen adam


Üyelik Bilgileri WWW
« Yanıtla #19 : Şubat 19, 2019, 17:21:48 ÖS »

C# ile ilgili pek bir bilgim olmasa da kodu kabaca inceleyince sorunun ilk başta anladığımdan farklı olduğu anladım. Sorun döngünün kendisinden değil de döngü içinde yaptığın işlemlerden kaynaklanıyor gibi.

Döngü içinde tekrarlanan şüphelenebileceğim iki kritik işlem var. Veri tabanı erişimi ve Excel'e (yanılmıyorsam xls dosyasına değil doğrudan programa veri göndererek) veri yazılması. Yerinde olsam bu iki işlemi ayrı ayrı 'comment out' yaparak süre ölçerdim. Suçluyu tespit ettikten sonra optimizasyon çaresine bakardım.

Ufak bir not. Kullandığım ERP ve Planlama yazılımlarından edindiğim tecrübe, Excel'in üçüncü parti yazılımlarla olan import/export performansından pek bir şey beklememek lazım.
Logged

i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #20 : Şubat 19, 2019, 17:42:07 ÖS »

Sql'den bir tablo okuyup Excel'de bir sheet'e bunu formatlayarak aktarıyorsun.
Excel'in interop'u kendi başına zaten çok yavaş bir de bu tip çok sayıda kaydın eklenmesi durumunda misliyle yavaşlıyor.

Bu dandik excel hala .net gibi platformlara sunduğu api'sinde arka planda bir excel açıyor ve senin verdiğin komutları kullanıcı onu uyguluyormuşçasına excel'e uyguluyor. Arada giden gelen mesajların birden fazla kez marshal / unmarshal edilmesini saymıyorum bile.

Benzer bir iş yapmadığım için bilmiyorum ancak formatlamayı data doldurmadan ayırman gerekiyor hızlı olabilmesi için. Data doldurma kısmını da mümkün mertebe Excel'e havale etmen lazım. Excel sheet'e data dolarken excel'in interop kullanırken yaptığı gereksiz işleri yapmıyor olması lazım.

Alternatif olarak, çözümü Excel'in içinde macro / vbscript vesaire bir çözüme de çevirebilirsin. Excel'in hali hazırda data import etme yetenekleri var.

Formatlama söz konusu olmadığında (örneğin csv dosya ile) milyonluk tabloyu çok uzun sürmeden yükleyebilmesi gerekir.

Bir diğer alternatif, excel'de göstereceğin nihai içeriği SQL tarafında hallet, import imkanları ile Excel'e datayı import etmesini söyle. Formatlama kısmını da satır satır değil de Range'ler vererek yaparsan hem formatlamış hem de hızlıca datayı aktarmış olursun. Alengirli formatlamalar yapamazsın orası ayrı.

Excel sux..
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
amenofis
Üye
**
Mesaj Sayısı: 48


Üyelik Bilgileri
« Yanıtla #21 : Şubat 19, 2019, 17:44:52 ÖS »

C# bilmiyorum c++ perspektifinden baktığımda ciddi bir optimizasyon sorununuz olduğu görülüyor. Multithread mümkün olabilir ama bu kolaya kaçmak olur. Yani şu işlemin tek thread ile 1 saniye sürmemesi lazım.

Mesela aşağıda alıntı yaptığım kodu ele alalım. Döngü 50 kere dönüyor ama yapılan işlemler hep aynı. Anladığıma göre get_Range ile belli bir hücre grubuna referans alıyorsunuz. Peki bu döngüde kullanılan bütün hücrelere tek bir referans alıp tek seferde özelliklerini değiştirmek mümkün olamaz mı? Bence kesinlikle mümkündür.

Ayrıca mesela döngünün her adımında
RengiSayiyaCevir(System.Drawing.Color.Black);
yapmışsınız. Halbuki renk hep aynı. Bunu döngü dışında 1 kere hesaplayıp
Alan.Font.Color = sayi; şeklinde yazabilirdiniz.


Kod:
for (int x = 1; x < 50; x++)
            {
                Alan = Sayfa.get_Range((object)Sayfa.Cells[2, 1], (object)Sayfa.Cells[x + 1, 20]);
                Alan.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                Alan.Font.Name = "MS Reference Sans Serif";
                Alan.Font.Color = RengiSayiyaCevir(System.Drawing.Color.Black);
                Alan.Font.Size = 10f;
                Alan.BorderAround(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlMedium, Excel.XlColorIndex.xlColorIndexAutomatic, Type.Missing);
                Alan.Value = Alan.Value;
            }
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #22 : Şubat 19, 2019, 17:56:13 ÖS »

Bu arada sonradan dikkatimi çekti,

İlk kayıtları okuduğun döngünün kayıt sayısı kadar bir daha SQL'e gidip sorgu çekiyorsun.

İlk sorgudan N adet kayıt geldiyse N defa bu ikinci sorguyu çalıştırıyorsun. Bu noktada senin uygulama öldü... (N'in büyük bir sayı olduğu varsayımı ile) O sorgu da M adet kayıt getiriyor, M defa da onun için dönüyorsun. Uygulama N * M defa dönüyor.

Bir tavsiye,

Şu yapıyı kullanma,

Kod:
                try
                {
// Kod
// Kod
// Kod
                }
                catch { }

Hata alıyorsan hatayı çözmen gerekir, bu şekilde hataya kulağını tıkıyorsun. Hatta hatanın ne olduğu bilgisi de ortadan kayboluyor. Try / catch blokları loglama yapacaksan (loglama yaptıktan sonra exception'ı yine throw etmen gerekir) yahut hataya müdahil olup onun yarattığı negatif etkiyi düzeltebileceksen kullanmalısın.
« Son Düzenleme: Şubat 19, 2019, 18:07:37 ÖS Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #23 : Şubat 19, 2019, 18:06:32 ÖS »

GPU'ya gelince. Excel'e veri aktarımının GPU ile yapılabileceğini sanmıyorum. GPU programlamadaki programlama paradigması bir hayli farklı. Tek komut / Çok data modeli var orada. Shader sayısı kadar unit'e farklı pixel verileri verilip sırayla programdaki komutlar işletiliyor. Dış sistemlerle entegre olabilen bir yapı değil, input var, program kodunuz var, çıktı var.

Sizin programda işi yavaşlatan programın tasarımının yapılan işe uygun olmaması.

Multithreading'i bence unutun. Excel multithreaded olarak hızlı çalışma potansiyeli olan bir uygulama değil. Hatta onu geçtim thread safe bile olmayabilir. Memory leak'ler ile vesaire çalıştığı makineyi kararsızlığa bile itebilir.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
WildLord
Deneyimli
*****
Mesaj Sayısı: 757



Üyelik Bilgileri
« Yanıtla #24 : Şubat 19, 2019, 18:42:26 ÖS »

Kullanıcıya veriyi ham haliyle excel dosyası olarak vermek daha iyi olmaz mıydı? Kullanıcı Excel içinde cari bazlı arayıp bulma zahmetinden kurtarmak için de süzme ve filtreleme gibi fonksiyonları göstermek iyi olurdu.
Bazı ticari programları kullandım ama onlarda bu şekilde biçimlendirilmiş excel çıktısı hiç görmedim.
Logged
Sayfa: 1 [2]   Yukarı git
Yazdır
Gitmek istediğiniz yer: