Hatalar, hatalar, sorular - sayfa 2668

 
Sergey Dzyublik :

Sorun şu ki, eğer bellek ayırıp dizi öğelerini birer birer oluşturursam, her şeyi bir kerede oluşturmaktan çok daha fazla zaman alır.

Kodda fark etmedi. O zaman anlaşılır, çünkü orada sadece bir tane çalışıyorsa, eğer boyut değişmediyse çıkıyoruz.

 
fxsaber :

Kodda fark etmedi. O zaman anlaşılır, çünkü orada sadece bir tane çalışıyorsa, eğer boyut değişmediyse çıkıyoruz.

Yukarıdaki kod #26666 ile ilgili açıklama

test1, ilk çağrıda tüm öğeleri bir kerede oluşturur, kalan ArrayResize çağrıları "boşta" olur.
ArrayResize == array_size için toplam çağrı sayısı:

      T class_array[];
       for ( int i = 1 ; i <= array_size; i++){
         ArrayResize (class_array, array_size);
      }


test2 bir öğe oluşturur ve başka bir array_size-1 öğesi için yer ayırır, ArrayResize çağrılarının geri kalanı dizide önceden ayrılmış bellekten +1 öğesi oluşturmaya gider.
ArrayResize == array_size için toplam çağrı sayısı:

      T class_array[];
       ArrayResize (class_array, 1 , array_size - 1 );
       for ( int i = 2; i <= array_size; i++){
         ArrayResize (class_array, i);
      }

* orijinal kodda bir hata oluştu (fark +- bir eleman). Kod güncellendi.
Soru açık kalıyor: neden test2 algoritması yapılar için test1'den 7 kat, sınıflar ve int için 2 kat daha yavaş?

 
Sergey Dzyublik :

Benim açımdan, ne karşılaştırılmalıydı.
Diziye kaç elemanın yerleştirileceğini biliyorum ve hepsini bir kerede oluşturmak yerine, oluşturulmamış olanlar için bellek ayırıyorum.
Sorun şu ki, eğer bellek ayırırsam ve dizi öğelerini birer birer oluşturursam, o zaman her şeyi bir kerede oluşturmaktan çok daha fazla zaman alır.
Yani yapılar için - 7 kat daha yavaş.
Ve veri türleri için sınıf ve int iki kat daha yavaştır.

Bu çok büyük bir fark, bana öyle geliyor ki, istenirse geliştiriciler ortadan kaldırabilir.

Bu durumda, yalnızca daha küçük bir ek yük olması gerektiğine katılıyorum.

Ama bence sorun daha çok nasıl karşılaştırdığınızdır. Test1'deki döngü büyük olasılıkla derleyici tarafından optimize edilmiş ve kaldırılmıştır ve muhtemelen aşağıdakiler bile:

 for ( ulong ii= 0 ;ii<count&&! _StopFlag ;ii++)

Bir profil oluşturucuyu deneyin ve yalnızca küçük bir fark göreceksiniz.

 

Profiler ile derleyici optimizasyonu yok.


 
Sergey Dzyublik :

Soru açık kalıyor: neden test2 algoritması yapılar için test1'den 7 kat, sınıflar ve int için 2 kat daha yavaş?

Varsayılan yapıcılar.

 
Alain Verleyen :

Test1'deki döngü büyük olasılıkla derleyici tarafından optimize edilmiş ve kaldırılmıştır.

Yukarıdaki kod #26666 Hata Ayıklama modunda çalıştırılırsa, frenler kullanıcı kodunun optimizasyonunda değil ArrayResize işlevinin çalışmasında olduğundan, daha önce elde edilenlere benzer sonuçlar görebilirsiniz.
Hata ayıklama modu herhangi bir optimizasyon olmadan yürütülür - kodda yazılanlar yürütülür, talimatlar arasına özel kesme noktaları için yalnızca nops eklenir.

 

Yeni hizmetteki SMS, SMS ile demo hesap açma onayına ulaşmıyor. Daha fazla burada.

https://www.mql5.com/ru/forum/334179#comment_1529250

Не могу открыть демо счет в AMP Global
Не могу открыть демо счет в AMP Global
  • 2020.03.04
  • www.mql5.com
Собственно, проблема описана в названии темы. Запрашивает подтверждение с электронки и телефона...
 
Sergey Dzyublik :

Yukarıdaki kod #26666 Hata Ayıklama modunda çalıştırılırsa, frenler kullanıcı kodunun optimizasyonunda değil ArrayResize işlevinin çalışmasında olduğundan, daha önce elde edilenlere benzer sonuçlar görebilirsiniz.
Hata ayıklama modu herhangi bir optimizasyon olmadan yürütülür - kodda yazılanlar yürütülür, talimatlar arasına özel kesme noktaları için yalnızca nops eklenir.

#26674 numaralı gönderide gösterildiği gibi, ArrayResize() ile ilgili bir sorun yoktur, yalnızca kıyaslama ile ilgili sorun yoktur. Bir şey kaçırmadıysam.
 
Alain Verleyen :
#26674 numaralı gönderide gösterildiği gibi, ArrayResize() ile ilgili bir sorun yoktur, yalnızca kıyaslama ile ilgili sorun yoktur. Bir şey kaçırmadıysam.

Sorun, gerçek bir projede vector<T>::push_back algoritması için bir darboğaz ararken keşfedildi.
Sorun, hem Yayın hem de Hata Ayıklama derlemelerinde ayrılmış bellek varlığında ArrayResize'ın yavaş yürütülmesinin bir parçası olarak kendini gösterir.

Profilleme hiçbir şey bulamadığı için her şeyin yolunda olduğunu söylüyorsunuz.
Kimse sonuçlara karşı değil.
Bununla birlikte, profil oluşturma sırasında sorunların görünür olmaması, kullanıcıların %100'ü tarafından kullanılan Yayın ve Hata Ayıklama derlemelerindeki varlığını reddetmez.

 
Sergey Dzyublik :

Sorun, gerçek bir projede vector<T>::push_back algoritması için bir darboğaz ararken keşfedildi.
Sorun, hem Yayın hem de Hata Ayıklama derlemelerinde ayrılmış bellek varlığında ArrayResize'ın yavaş yürütülmesinin bir parçası olarak kendini gösterir.

Profilleme hiçbir şey bulamadığı için her şeyin yolunda olduğunu söylüyorsunuz.
Kimse sonuçlara karşı değil.
Bununla birlikte, profil oluşturma sırasında sorunların görünür olmaması, kullanıcıların %100'ü tarafından kullanılan Yayın ve Hata Ayıklama derlemelerindeki varlığını reddetmez.

Sadece verdiğiniz test kodu hakkında konuşabilirim.

Her durumda, geliştiricilerin ne dediğini göreceğiz. Belki.

Neden: