Değişkenleri bir döngünün arkasında mı yoksa bir döngünün içinde mi bildiriyorsunuz? - sayfa 4

 

Kusura bakmayın arkadaşlar proje ayarlarından optimizasyon kapatılmış.

kod:

   CStopWatch sw; // Секундомер, для замера времени
   
   sw.Start();
   for ( int i = 0 ; i < 10000000 ; i++)
   {
       string st = ( string )i;
   }
   pr( "Test1, время выполнения: " + sw.Stop());

   sw.Start();
   string st = "" ;
   for ( int i = 0 ; i < 10000000 ; i++)
   {
      st = ( string )i;
   }
   pr( "Test2, Время выполнения: " + sw.Stop());


Optimizasyon olmadan

Test1, время выполнения: 0.548275 сек.
Test2, Время выполнения: 0.313978 сек.

Optimizasyon ile

Test1, время выполнения: 0.420523 сек.
Test2, Время выполнения: 0.545999 сек.

Optimizasyon ile evet, tam tersi doğru, defalarca kontrol ettim

 
Aleksandr Matveev :

Su baskınını durdurun, önce malzemede ustalaşın ve ardından davanızı kanıtlayın. İşlemcinin ve belleğin çalışması hakkında en az bir kitap okusaydınız, sonuç herhangi bir test yapmadan sizin için net olurdu. Size bunların en ustacasını sundum, eğer programlamada sessizce ilerlemek istiyorsanız mutlaka okuyacaksınız.

Ve işte bellek ve işlemci, optimizasyondan bahsediyoruz, sen bir kitap teorisyenisin)

 
Igor Makanu :

garip değil, MQL'deki en basit operatörleri ve işlemleri test edebilmeniz gerekiyor - peki, neden testime srand(GetTickCount()) ekledim?

;)

Bu arada daha dikkatli baktım oradaki döngüde de sonuç var gelecekte dikkate alınmaz, bu da derleyicinin onu kolayca kesebileceği anlamına gelir.

 
Alexey Navoykov :

Bu arada daha dikkatli baktım oradaki döngüde sonuç var gelecekte dikkate alınmaz, bu da derleyicinin kolayca kesebileceği anlamına gelir.

kaldırılmış rand() bile - derleyicisi mükemmel bir şekilde satır içi, aşağıdaki testi yaptı:

 #define N 8

#define   test(M,S,EX) {                                 \
uint mss= GetTickCount ();                                 \
ulong nn=( ulong ) pow ( 10 ,M);                               \
for ( ulong tst= 0 ;tst<nn && ! _StopFlag ;tst++) \
{ EX; }                                                  \
printf ( "%s: loops=%i ms=%u" ,S,nn, GetTickCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string s1;  test(N, "1. s1=rand()" ,s1=( string )tst);
   string s2;  test(N, "2. s2=rand()" ,s2=( string )tst);
   string s3;  test(N, "3. s3=rand()" ,s3=( string )tst);
   string s4;  test(N, "4. s4=rand()" ,s4=( string )tst);
   string s5;  test(N, "5. s5=rand()" ,s5=( string )tst);

   test(N, "1. q=rand()" , string q=( string )tst);
   test(N, "2. q=rand()" , string q=( string )tst);
   test(N, "3. q=rand()" , string q=( string )tst);
   test(N, "4. q=rand()" , string q=( string )tst);
   test(N, "5. q=rand()" , string q=( string )tst);
  }
//+------------------------------------------------------------------+

2019.08.18 11:55:41.457 Hız Testi (EURUSD,H1) 1. s1=rand(): döngüler=100000000 ms=7672

2019.08.18 11:55:49.085 Hız Testi (EURUSD,H1) 2. s2=rand(): döngüler=100000000 ms=7625

2019.08.18 11:55:56.796 Hız Testi (EURUSD,H1) 3. s3=rand(): döngüler=100000000 ms=7719

2019.08.18 11:56:04.495 Hız Testi (EURUSD,H1) 4. s4=rand(): döngüler=100000000 ms=7703

2019.08.18 11:56:12.113 Hız Testi (EURUSD,H1) 5. s5=rand(): döngüler=100000000 ms=7610

2019.08.18 11:56:17.695 Hız Testi (EURUSD,H1) 1. q=rand(): döngüler=100000000 ms=5578

2019.08.18 11:56:23.362 Hız Testi (EURUSD,H1) 2. q=rand(): döngüler=100000000 ms=5672

2019.08.18 11:56:28.970 Hız Testi (EURUSD,H1) 3. q=rand(): döngüler=100000000 ms=5609

2019.08.18 11:56:34.637 Hız Testi (EURUSD,H1) 4. q=rand(): döngüler=100000000 ms=5672

2019.08.18 11:56:40.277 Hız Testi (EURUSD,H1) 5. q=rand(): döngüler=100000000 ms=5640


 
Alexey Navoykov :

Öyleyse diyorum ki, "hata yapmamak" istiyorsanız, o zaman montajcıya gidin. Her şeyi kişisel olarak kontrol etmeniz gerektiğinden ... Sonuçta, açıklanan durum tam bir önemsememek. Daha karmaşık büyüklük sıraları olan şeyler var. OOP sizin için kesinlikle kontrendikedir. Derleyicinin şu veya bu sanal yöntemi normal bir çağrıya dönüştürdüğünü veya gereksiz bir işaretçi kontrolünü kesip kesmediğini bilemezsiniz... Böyle bir paranoya ile yönetilen MQL'de ne yapılabilir? )

Ve kodu derleyicinin (ve hayali olanların) özelliklerine göre, kodun doğruluğuna ve güvenilirliğine zarar verecek şekilde ayarlamak - bu açıkça iyi bir programcının yapması gereken şey değildir. Ve burada kodun yanlışlığından bahsediyoruz. Değişken, kullanıldığı blokta doğrudan bildirilmelidir.

Ha-ha-ha... Alexey, forumdaki OOP'nin ana yandaşlarından biri için "OOP kesinlikle kontrendikedir" diye iddia ediyorsunuz (haydi "siz").

Kod, derleyicinin özelliklerine göre değil, SİZİN düşüncenizin özelliklerine göre ayarlanmalıdır. Bu durumda - teoride döngü içinde bir değişken bildirmek verimliliği azaltır. Çünkü kabul edilen uzlaşımlara göre her seferinde bir değişken yaratılmalı ve her seferinde yok edilmelidir.

Verimlilikle ilgili bile değil. Güvenilir kod, şeffaf, anlaşılır ve değiştirilmesi ve bakımı kolay koddur.

Şahsen, program boyunca bir sürü değişken dağıldığından ve her seferinde şu veya bu değişkenin nerede oluşturulduğuna bakmanız gerektiğinden gerçekten hoşlanmıyorum. Bu nedenle, nerede oluşturulduklarını görmek ve ne zaman silineceklerini anlamak için mümkün olduğunca fonksiyonun başında değişkenleri hep birlikte bildirmeye çalışıyorum.

Bu durumda, örnek çok kısadır. Bir değişkenin oluşturulması ve kullanımı arasında düzinelerce satır ve bir sürü iç içe işlev olduğunda - benim için - değişken önceden bloğun dışında bildirildiğinde çok daha güvenilirdir.

 
pivalexander :

Kusura bakmayın arkadaşlar proje ayarlarından optimizasyon kapatılmış.

kod:


Optimizasyon olmadan

Optimizasyon ile

Optimizasyon ile evet, tam tersi doğru, defalarca kontrol ettim

Genel olarak, bu örnekte, optimizasyon yardımıyla döngünün tüm gövdesi kesilebilir.

 

Genel olarak, her şey beklendiği gibi, saçma sapan uğraşmaya, var olmayan sorunları maviden aramaya ve gerçek sorunlar yaratmaya gerek olmadığına yakınlaşıyor.

Elleriniz kaşınıyorsa ve kendinizi havalı bir havalı bilgisayar korsanı olarak görüyorsanız, hemen assembler'a yazın. Aksi takdirde kenara çekilip derleyici amcanızın işini yapması için uğraşmayın)

 
Aleksandr Matveev :

Genel olarak, bu örnekte, optimizasyon yardımıyla döngünün tüm gövdesi kesilebilir.

Boş bir döngü gövdesiyle yürütmenin sonucu çok farklıdır, çok daha hızlı çalışır

Без оптимизации:
Test1, время выполнения: 0.027539 сек.

С оптимизацией:
Test1, время выполнения: 0.005448 сек.
 
Alexey Navoykov :

Genel olarak, her şey beklendiği gibi, saçma sapan uğraşmaya, var olmayan sorunları maviden aramaya ve gerçek sorunlar yaratmaya gerek olmadığına yakınlaşıyor.

Elleriniz kaşınıyorsa ve kendinizi havalı bir havalı bilgisayar korsanı olarak görüyorsanız, hemen assembler'a yazın. Aksi takdirde kenara çekilip derleyici amcanızın işini yapması için uğraşmayın)

Asıl sorun, kendimi havalı bir bilgisayar korsanı olarak görmemem. Bu yüzden bence değişkenler döngünün dışında bildirilmelidir. Ve daha iyisi - işlevin en başında, hepsi aynı anda.

Ve sadece havalı korsanlar - gerektiğinde değişkenleri kodun içinde bildirebilirler.

 
Georgiy Merts :

Asıl sorun, kendimi havalı bir bilgisayar korsanı olarak görmemem. Bu yüzden bence değişkenler döngünün dışında bildirilmelidir. Ve daha iyisi - işlevin en başında, her şey aynı anda.

Ve sadece havalı korsanlar - gerektiğinde değişkenleri kodun içinde bildirebilirler.

Kodu mantıksal bloklara ayırmayı ve içlerinde ihtiyaç duydukları değişkenleri bildirmeyi ve çoğuna yalnızca bir blokta, çok aşağıda bir yerde ihtiyaç duyulan bir dizi değişkeni işlevin başında çitlememeyi tercih ederim.

Neden: