Verilen eleman(lar)ın bir dizisini temizleme - sayfa 16

 
Taras Slobodyanik :

Bayrakların başarıyla eşleştiğini düşünüyorum:
http://osinavi.ru/asm/4.php

ve ekstra operatörler/karşılaştırmalar için...

Profilden kontrol ettim. Karşılaştırma, atama ve mat işlemlerinin sayısı aynıdır
 
Nikolai Semko :

Anlamadığım yürütme süresindeki farka geri dönüyorum, mantıkta neredeyse% 100 aynı, kontrol sayısı ve iki döngünün toplamı:


Zaten yukarıda yazdım - kodumda daha az karşılaştırma işlemi var ...

-----

90'larda ders dışı etkinliklerden:

1) Eğer (koşullar) A, B, C bağımsızsa, olasılık arttıkça VE işlevine ve azaldıkça OR işlevine itilmelidirler.

ve eğer bağımlılarsa, tek bir ifadede birleştirilemezler (yani do if (A && B) ).

2) İç içe döngüler A, B varsa, o zaman dış döngü daha kısa olmalıdır.

3) Döngünün içinde bir koşul varsa, mümkünse döngüyü bölmek ve koşulu çıkarmak gerekir.

 
Maxim Kuznetsov :

Zaten yukarıda yazdım - kodumda daha az karşılaştırma işlemi var ...

-----

90'larda ders dışı etkinliklerden:

1) Eğer (koşullar) A, B, C bağımsızsa, olasılık arttıkça VE işlevine ve azaldıkça OR işlevine itilmelidirler.

ve eğer bağımlılarsa, tek bir ifadede birleştirilemezler (yani do if (A && B) ).

2) İç içe döngüler A, B varsa, o zaman dış döngü daha kısa olmalıdır.

3) Döngünün içinde bir koşul varsa, mümkünse döngüyü bölmek ve koşulu çıkarmak gerekir.


1) tam tersine, yaptığınız. C'de koşullu operatörlerin yürütülmesinin özellikleri. AND operatöründeki ilk koşul yürütülmezse, neden diğer tüm koşulları kontrol edin. Bu nedenle, önce büyük olasılıkla yanlış olan koşulu kontrol ederiz.

Her ne kadar evet - öyle: bileşik bir durumda ifadelerin doğruluğu olasılığının artan düzeninde sıralama.

 
Алексей Тарабанов :

1) tam tersine, yaptığınız. C'de koşullu ifadelerin yürütülmesinin özellikleri.

belki yanlış yazmışımdır ama herkes hemen açıklasa nasıl olur...

A && B &&C

VE, diğer tüm koşullardan geçmemek için mümkün olan en kısa sürede başarısız olmalıdır. Yani, daha sonraki tüm zincirin yürütülmesini bozacak olan ilk yüklem koyulur. Programcı için optimize edici bunu yapmayacaktır (*) çünkü programın hangi veriler üzerinde yürütüldüğünü bilmiyor

Bir || B || C

tam tersi :-) çünkü boole aritmetiği.. !( (!A)&&(!B)&&(!C)) )

*) derleyicileri optimize etmek, koşulların bu şekilde ayarlandığı gerçeğine güvenebilir ve iç mutfağını bu varsayımlar üzerine inşa edebilir.

 
Maxim Kuznetsov :

belki yanlış yazmışımdır ama herkes hemen açıklasa nasıl olur...

A && B &&C

VE, diğer tüm koşullardan geçmemek için mümkün olan en kısa sürede başarısız olmalıdır. Yani, daha sonraki tüm zincirin yürütülmesini bozacak olan ilk yüklem koyulur. Programcı için optimize edici bunu yapmayacaktır (*) çünkü programın hangi veriler üzerinde yürütüldüğünü bilmiyor

Bir || B || C

tam tersi :-) çünkü boole aritmetiği.. !( (!A)&&(!B)&&(!C)) )

*) derleyicileri optimize etmek, koşulların bu şekilde ayarlandığı gerçeğine güvenebilir ve iç mutfağını bu varsayımlar üzerine inşa edebilir.

Tamamen katılıyorum.

 
Nikolai Semko :

Anlamadığım yürütme süresindeki farka geri dönüyorum, mantıkta neredeyse% 100 aynı ve iki döngünün kontrol ve toplam sayısı:

Tekrar ediyorum, neden Kuznetsov'un kodundan böyle bir seçenek:

bunun iki katından daha hızlı çalışır ve tam olarak aynı şeyi yapar:

Derleyicinin harikaları nelerdir?
Gerçekten böyle bir tasarım için:

derleyici, işlemci için bazı özel montajcı arama talimatları buluyor mu? Ama içeride ek bir i<j kontrolü var mı?

sonuçta, aynı şey aşağıdakiler için gözle görülür şekilde daha yavaş yapılır:

Ekli, gösteren komut dosyası kodudur.

Bu sık sık böyle olur. Görünüşe göre gereksiz bir çöplük yapıyorsun ve kendin için çok ilginç bir şey buluyorsun.

Geliştiriciler, yürütülebilir koda bakabilir misiniz, neden böyle bir fark var?

Sonuçta, gelecekte daha optimal algoritmalar oluşturmak için derleyicinin mantığını anlamanız gerekir.

Genel olarak, garip bir durum.Sanırım çok şey derleyiciye ve testin yapıldığı makineye bağlı.İşte 32 bitlik bir makinedeki örneğinizin sonucu

1


Gördüğünüz gibi, özel bir avantaj yok. Ve işte son seçenekten bir diziden silme işlevlerinin bir testi.

2

 
ayrıca, bazen test sırasında sonuçlar öncekilerden çok farklı olabilir ve bunun neyle bağlantılı olduğu açık değildir, belki de MQL'de kod işlerken bazı özel kesme sistemleri
 
Stanislav Dray :
ayrıca, bazen test sırasında sonuçlar öncekilerden çok farklı olabilir ve bunun neyle bağlantılı olduğu açık değildir, belki de MQL'de kod işlerken bazı özel kesme sistemleri

algoritmaları test ederken, almak gerekir

* veya önceden hazırlanmış veri kümeleri (gerçekte gerekli olanlara yaklaşık olarak benzer),

* veya RNG'de çok önemli sayıda geçiş yapmak,

testlerde:

* test sırasını değiştirin/karıştırın ve

* duraklamaları gözlemleyin ve her türlü önbelleği sıfırlayın

 
Maxim Kuznetsov :

algoritmaları test ederken, almak gerekir

* veya önceden hazırlanmış veri kümeleri (gerçekte gerekli olanlara yaklaşık olarak benzer),

* veya RNG'de çok önemli sayıda geçiş yapmak,

testlerde:

* test sırasını değiştirin / karıştırın ve

* duraklamaları gözlemleyin ve her türlü önbelleği sıfırlayın



Peki, önceden hazırlanmış verileri nasıl kullanırdık. Tüm fonksiyonları test etmek için aynı veriler kullanılır. Ancak karıştırma / değiştirme pahasına, evet. Testlerin sırasını değiştirirseniz bir fark fark ettim. Ancak önbellekler nasıl sıfırlanır?

 
Maxim Kuznetsov :

algoritmaları test ederken, almak gerekir

* veya önceden hazırlanmış veri kümeleri (gerçekte gerekli olanlara yaklaşık olarak benzer),

* veya RNG'de çok önemli sayıda geçiş yapmak,

testlerde:

* test sırasını değiştirin / karıştırın ve

* duraklamaları gözlemleyin ve her türlü önbelleği sıfırlayın



insanları kandırmaya gerek yok