Sıralı olarak bir numaralandırma üzerinde yineleme nasıl yapılır? - sayfa 3

 
Alexey Navoykov :

Burada gösterilen örnekler (durum 1: dönüş değeri1; durum 2: dönüş değeri2; durum 3:dönüş değeri3... vb.) genellikle bir aptallık örneğidir. Yeterli bir kişi tüm değerleri bir diziye koyacak ve indeksinden istenen değeri basitçe alacaktır. Ve ters problem için ikili aramayı kullanın.

Dizilerle güzel kod için iki elle. Ancak standart olandan daha hızlı bir NormalizeDouble yazarken, bir optimize edici efektle karşılaştım - const dizisi aracılığıyla güzel bir çözüm, bir anahtar kasası aracılığıyla hantal olandan belirgin şekilde daha yavaştı. NormalizeDouble test cihazında çok kullanıldığı için ikinci seçeneği bıraktım. Onu inkludnik'e koydum ve bu canavara bakmadım. Ancak geriye dönük testler daha hızlı çalışır.
 
fxsaber :
Dizilerle güzel kod için iki elle. Ancak standart olandan daha hızlı bir NormalizeDouble yazarken, bir optimize edici efektle karşılaştım - const dizisi aracılığıyla güzel bir çözüm, bir anahtar kasası aracılığıyla hantal olandan belirgin şekilde daha yavaştı. NormalizeDouble test cihazında çok kullanıldığı için ikinci seçeneği bıraktım. Onu inkludnik'e koydum ve bu canavara bakmadım. Ancak geriye dönük testler daha hızlı çalışır.

Anahtar iyileştirilmiş gibi görünüyor. Bir keresinde, geliştiricilerin yalnızca uygulama hakkında ikili arama biçiminde konuştuğu tartışmasıyla ilgili bir başlık olduğunu hatırlıyorum ve bu, doğal olarak yalnızca hesaplanmış bir dizine erişmekten çok daha yavaş. Ama şimdi, görünüşe göre, akıllıca yaptılar: adım sabitse, o zaman endeksin hesaplanması, aksi takdirde ikili arama. O zaman, tabii ki, yerel uygulama, sarmalayıcı olandan her zaman daha hızlıdır.

Burada, elbette, öncelikleriniz üzerine inşa etmek zaten gerekli. Ama IMHO, hız o kadar kritikse ki koltuk değneği icat etmeye hazırsınız, o zaman OOP'yi ve genel olarak MQL'yi terk etmeniz gerekir;) Doğru kod yapımı ile eminim ki, hızdaki bu fark o kadar önemli olmayacaktır. . Fonksiyonu aptalca bir döngüde milyonlarca kez çalıştırmanız test ölçümlerindedir. Ve gerçek kodda onu daha rasyonel kullanıyorsun, değil mi?

 
Alexey Navoykov :

Anahtar iyileştirilmiş gibi görünüyor. Bir keresinde, geliştiricilerin yalnızca uygulama hakkında ikili bir arama biçiminde konuştuğu tartışmasıyla ilgili bir başlık olduğunu hatırlıyorum ve bu, doğal olarak yalnızca hesaplanmış bir dizine erişmekten çok daha yavaş. Ama şimdi, görünüşe göre, akıllıca yaptılar: adım sabitse, o zaman endeksin hesaplanması, aksi takdirde ikili arama. O zaman, tabii ki, yerel uygulama, sarmalayıcı olandan her zaman daha hızlıdır.

Derleyici, aptal değilse, const-array yapmak ve dizine göre tek tipik erişimi anahtar koduna dönüştürmek zorunda kalacaktır.

Burada, elbette, önceliklerinizi zaten oluşturmanız gerekiyor. Ama IMHO, eğer hız koltuk değneklerini icat etmeye hazır olacak kadar kritikse, o zaman OOP'yi ve genel olarak MQL'yi terk etmeniz gerekir;) Doğru kod yapısı ile hızdaki farkın o kadar önemli olmayacağından eminim. . Fonksiyonu aptalca bir döngüde milyonlarca kez çalıştırmanız test ölçümlerindedir. Ve gerçek kodda onu daha rasyonel kullanıyorsun, değil mi?

Hız kritik değil, ancak mantıksız yazdığımda güçlü bir rahatsızlık hissediyorum. OOP'yi hiç kullanmamak elbette mantıklı değil. Kısacası, gönderdiğim kod tabanındaki mütevazı denemelere bakın ve çek üzerinde yalan söylüyorum, şimdiden kaç gün olduğunu sayamıyorum. Orada aynı NormalizeDouble şeklindeki koltuk değneklerinin nereden geldiğini anlayacaksınız. Bu, geliştiricilerin bazen irrasyonel uygulamalarından rastgele bir gerçeğin sonucudur.
 
fxsaber :
Derleyici, aptal değilse, const-array yapmak ve dizine göre tek tipik erişimi anahtar koduna dönüştürmek zorunda kalacaktır.

Yani dizi sadece bir const mı? Peki ya statik? Eğer öyleyse, o zaman gerçekten aynı olmalı. Evet ve neden "kod değiştir", sonuçta, burada en basit işlemler: dizin değerini dizinin / numaralandırmanın boyutuyla karşılaştırırız, daha azsa, istenen öğenin adresini adresi olarak alırız. dizi + indeks, peki, değeri oradan okuyoruz. Bana böyle saçmalıkların aynı şekilde derlenmesi gerektiği gibi geldi.

Kısacası, gönderdiğim kod tabanındaki mütevazi denemelere bakın ve çek üzerinde yalan söylüyorum, şimdiden kaç gün olduğunu sayamıyorum. Orada aynı NormalizeDouble şeklindeki koltuk değneklerinin nereden geldiğini anlayacaksınız. Bu, geliştiricilerin bazen irrasyonel uygulamalarından rastgele bir gerçeğin sonucudur.
Ne tür bir "çekme" kastettiğin açık değil. Ve bu arada, ne zamandır bu karşılaştırmaları yapıyorsun? Belki o zaman derleyici hala "aptal" idi?
 
Alexey Navoykov :

Yani dizi sadece bir const mı? Peki ya statik? Eğer öyleyse, o zaman gerçekten aynı olmalıdır. Evet ve neden "kod değiştir", işte en basit işlemler: dizin değerini dizinin / numaralandırmanın boyutuyla karşılaştırırız, daha azsa, istenen öğenin adresini dizi + dizin adresi olarak alırız , peki, değeri oradan okuyoruz. Bana böyle saçmalıkların aynı şekilde derlenmesi gerektiği gibi geldi.

Statik dizileri const yapmanın mümkün olup olmadığını tam olarak hatırlamıyorum. Yöntemler - kesinlikle hayır. Temelde tam olarak const yaptı, statik değil. Derleyicinin zihnine dayalıdır. Derlemeden sonra, sakatatlarda bir dizi ipucu hiç olmamalıydı. Statik, const'tan çok daha karmaşık bir yapıdır. Bu nedenle derleyicinin kesinlikle statik ile baş edemeyeceğinden emindim. Ama denemek zorunda kalacaksın.

Ne tür bir "çekme" kastettiğin açık değil. Ve bu arada, ne zamandır bu karşılaştırmaları yapıyorsun? Belki o zaman derleyici hala "aptal" idi?
Moderatörlerden biri birkaç düğmeye basacağı ve kodu kod tabanında yayınlamaya devam edeceği için girişimler görünür olacaktır. Performansı düşünmeden kendim için uygun bir çözüm yaptım, ancak sonuç 1383 32-bit derlemesinde neredeyse büyüklük sırasına göre bir kazanç oldu.
 
fxsaber :

Statik dizileri const yapmanın mümkün olup olmadığını tam olarak hatırlamıyorum. Yöntemler - kesinlikle hayır. Temelde tam olarak const yaptı, statik değil. Derleyicinin zihnine dayalıdır. Derlemeden sonra, sakatatlarda bir dizi ipucu hiç olmamalıydı. Statik, const'tan çok daha karmaşık bir yapıdır. Bu nedenle derleyicinin kesinlikle statik ile baş edemeyeceğinden emindim. Ama denemek zorunda kalacaksın.

Ah, o zaman her şey açık. Derleyicinin aşırı zekasına güvenmemelisiniz, kötü tasarlanmış bir çözümü sizin için yeniden optimize edeceğini söylüyorlar. Kendiniz çok tembelseniz / doğru yapmayı düşünmediyseniz, “statik çok daha karmaşık” derler (orada neyin karmaşık olduğu açık olmasa da), o zaman neden bundan sonra derleyiciyi suçlayasınız?

 
Alexey Navoykov :

Ah, peki, o zaman her şey açık. Derleyicinin aşırı zekasına güvenmemelisiniz, kötü tasarlanmış bir çözümü sizin için yeniden optimize edeceğini söylüyorlar. Kendiniz çok tembelseniz / doğru yapmayı düşünmediyseniz, “statik çok daha karmaşık” derler (orada neyin karmaşık olduğu açık olmasa da), o zaman neden bundan sonra derleyiciyi suçlayasınız?

Diziye statik eklendi. Anahtardan neredeyse üç kat daha hızlı çalışmaya başladı! Çöpte, böyle bir anahtar . Bahşiş için teşekkürler!
 
fxsaber :
Statik diziye eklendi. Anahtardan neredeyse üç kat daha hızlı çalışmaya başladı! Çöpte, böyle bir anahtar . Bahşiş için teşekkürler!

Rica ederim. Koltuk değneklerini icat etmek için koşmadan önce 7 kez düşünmeniz gereken gelecek için bir ders olacak)

Şimdi, anahtarı erkenden, daha doğrusu geliştiricilerini övdüğüm ortaya çıktı. Bu nedenle, numaralandırma birden fazla adımla gelse bile, her şey orada yalnızca ikili arama yoluyla uygulanır. İyi değil.

 
Alexey Navoykov :

Rica ederim. Koltuk değneklerini icat etmek için koşmadan önce 7 kez düşünmeniz gereken gelecek için bir ders olacak)

Standart NormalizeDouble'dan (1395 yapı) neredeyse dört kat daha hızlı ... bu, geliştiricilerin bir koltuk değneğidir.

 
fxsaber :
Standart NormalizeDouble'dan (1395 yapı) neredeyse dört kat daha hızlı ... bu, geliştiricilerin bir koltuk değneğidir.

Her şey günahsız değildir)