Benim yaklaşımım. Çekirdek - Motor. - sayfa 87

 
Vasiliy Sokolov :
ps Spesifik olarak, MT nesnelerinde dizeleri depolama konusunda garip bir hata var. Bir nesne adına verileri sıkıştırmaya ve yazdırılamayan karakterler kullanmaya başlarsanız, bazı durumlarda bu nesneye erişemezsiniz. Arıza büyük olasılıkla hala mevcuttur, çünkü çok spesifiktir ve çok az kişi bunu bilir, ancak buna rastlayabilirsiniz.

Apaçık. Sadece pratik, sonunda her şeyi bulmaya yardımcı olacaktır.

 
Реter Konow :

Sevgili rakipler.

İşte komut dosyası kodu:

  1. Bir dizeyi Char dizisine aktarmak, dizeyi bir kaynak aracılığıyla başka bir programa geçirmek için geçen süreyi ve sonraki bölme ve bilgi ayıklamak için dizeyi Char dizisinden çıkarma süresini ölçer.
  2. MT nesnesinin açıklamasına bir dize yazma zamanını ve sonraki bölme ve bilgi çıkarma için MT nesnesinin açıklamasından dize alma zamanını ölçer.

Sonuç:


Peter, yanlış şeyi ve yanlış yeri test ediyorsun. Test ettiğiniz şey, stringlerle çalışma mantığına göre yaklaşık olarak aynı hıza sahip olmalıdır.

Mesajımı hiç anlamadın.

Mesajım, çift, uzun, zaman, int vb. İletmek için dizeleri kullanmayı bırakmaktı. Ve metni aktarmanız gerekiyorsa, metin dizesini bir uchar dizisine çevirin. Ve bu yapıların birleşik veri yapıları veya dizileri aracılığıyla çeşitli türlerdeki tüm karışık veriler, union kullanılarak uint dizilerine dönüştürülür, kaynaklar aracılığıyla aktarılır ve resepsiyonda bu uint dizileri de union yoluyla orijinal yapılara dönüştürülür. İnan bana Peter, tangalar çok yavaştır, mümkün olduğunca onlardan uzak durmalısın. Tangalar sadece metin ve baskı için gereklidir.

Ve örneğinizde, performans ölçümü kavramını tamamen yanlış anladınız.

Ayrıca, OBJPROP_TEXT özelliği aracılığıyla maksimum 63 bayt boyutunda bir dize aktarabilirsiniz. Hiçbir şey hakkında değil.

Örneğiniz tamamen anlamsız olsa da, onu yalnızca gösterim için daha doğru bir şeye dönüştürdüm ve 63 bayt boyutunda 1000 farklı dizeyi kopyalarken olan buydu:

Script kodu ektedir. Hem MT4 hem de MT5'te çalışır

MT4:

 2018.12 . 19 00 : 50 : 14.542 TestStringVsCharArray NZDUSD,Weekly: время через свойство объекта:       2309 правильность копирования - true
2018.12 . 19 00 : 50 : 14.542 TestStringVsCharArray NZDUSD,Weekly: время через uchar массив:           1882 правильность копирования - true

MT5:

 2018.12 . 19 00 : 32 : 30.857 TestStringVsCharArray (NZDUSD,M1)       время через свойство объекта:       32811 правильность копирования - true
2018.12 . 19 00 : 33 : 00.678 TestStringVsCharArray (NZDUSD,M1)       время через uchar массив:           364   правильность копирования - true

MT5'te nesnelerle çalışma eşzamansız gibi görünüyor, bu nedenle yönteminiz 100 kat daha yavaş ve MT5 için hiç uygun değil. Ve şimdi MT5'e daha fazla bahis oynamanız gerekiyor

ve bu nedir?:

 StringToCharArray (qwerty,Arr, 0 , WHOLE_ARRAY );

yardımı oku

Dosyalar:
 
Реter Konow :

Sevgili rakipler.

İşte komut dosyası kodu:

  1. Bir dizeyi Char dizisine aktarmak, dizeyi bir kaynak aracılığıyla başka bir programa geçirmek için geçen süreyi ve sonraki bölme ve bilgi ayıklamak için dizeyi Char dizisinden çıkarma süresini ölçer.
  2. MT nesnesinin açıklamasına bir dize yazma zamanını ve sonraki bölme ve bilgi çıkarma için MT nesnesinin açıklamasından dize alma zamanını ölçer.

Sonuç:


Dikkatlice okuyup sonuçlar çıkarıyoruz: https://docs.mql4.com/ru/basis/types/stringconst
Sonuçlarla ilgili yardım:
1. Dizedeki her karakter için 2 bayt tahsis edilir, Unicode kodlaması. Sıra kapasitesinin tam olarak kullanılmaması.
2. CharArrayToString işlevini kullanırken (ve tersi), dönüştürme, uchar dizisindeki karakter kodlamasına göre gerçekleşir ve bu da CPU zamanını tüketir. ShortArrayToString kullanın (ve tersi).
Denemek. Unicode'da dizenin sıfırla bitmesi gerektiğini unutmayın.
 
Aliaksandr Hryshyn :
Dikkatlice okuyup sonuçlar çıkarıyoruz: https://docs.mql4.com/en/basis/types/stringconst
Sonuçlarla ilgili yardım:
1. Dizedeki her karakter için 2 bayt tahsis edilir, Unicode kodlaması. Sıra kapasitesinin tam olarak kullanılmaması.
2. CharArrayToString işlevini kullanırken (ve tersi) , dönüştürme, uchar dizisindeki karakter kodlamasına göre gerçekleşir ve bu da CPU zamanını tüketir. ShortArrayToString kullanın (ve tersi).
Denemek. Unicode'da dizenin sıfırla bitmesi gerektiğini unutmayın.

aynı fikirde olmamak. Ara dizi olarak bir dizge için bir uchar dizisine ihtiyacımız var. Ve dönüştürme yoktur, ancak basit bir bayt kopyalaması vardır.

 
Nikolai Semko :

aynı fikirde olmamak. Ara dizi olarak bir dizge için bir uchar dizisine ihtiyacımız var. Ve dönüştürme yoktur, ancak basit bir bayt kopyalaması vardır.

Kiril alfabesini aktarmaya çalışın. Ve uchar dizisindeki ve dizideki karakter kodlarını karşılaştırın, dizi bir ushort dizisi olarak gelir.
 
Aliaksandr Hryshyn :
Kiril alfabesini aktarmaya çalışın. Ve uchar dizisindeki ve dizideki karakter kodlarını karşılaştırın, dizi bir ushort dizisi olarak gelir.

Unicode'un ne olduğunu biliyorum. Ancak bizim durumumuzda, uint dizisini kaynak üzerinden daha fazla aktarım için ve ters dize kurtarma zincirini aldığımızda birlik yoluyla elde etmek için yalnızca uchar dizisine ihtiyacımız var. Herhangi bir kayıp olmayacak. Ve bu görev için uchar dizisinden karakter çıkarmamıza gerek yok.

özellikle bu fonksiyonların son parametresini dikkatlice inceleyin. Kodlama değiştirilebilir ve varsayılan, unicode değildir.

 
Nikolai Semko :

Peter, yanlış şeyi ve yanlış yeri test ediyorsun. Test ettiğiniz şey, stringlerle çalışma mantığına göre yaklaşık olarak aynı hıza sahip olmalıdır.

Nikolay, tüm saygımla, bunlar boş sözler. Senaryoyu ölçtüm ve ekledim. "Doğru-yanlış yaklaştı...", "dizelerle çalışma mantığına göre yaklaşık olarak aynı hıza sahip olmalı"... Sadece kelimeler.

Nikolay Semko :

...

Mesajımı hiç anlamadın.

Mesajım, çift, uzun, zaman, int vb. İletmek için dizeleri kullanmayı bırakmaktı. Ve metni aktarmanız gerekiyorsa, metin dizesini bir uchar dizisine çevirin. Ve bu yapıların birleşik veri yapıları veya dizileri aracılığıyla çeşitli türlerdeki tüm karışık veriler, union kullanılarak uint dizilerine dönüştürülür, kaynaklar aracılığıyla aktarılır ve resepsiyonda bu uint dizileri de union yoluyla orijinal yapılara dönüştürülür. İnan bana Peter, tangalar çok yavaştır, mümkün olduğunca onlardan uzak durmalısın. Kayışlar yalnızca metin ve baskı için gereklidir.

Mükemmel bir şekilde anladığım mesajınızdı. VE O YANLIŞTIR.

Niye ya? - Çünkü zaman zaman kontrollerin parametreleri ile çalışma sistemini karmaşık hale getirmek gerekli olacaktır. Parametreleri depolama, aktarma ve yönetme mimarisi ÇOK daha karmaşık ve kafa karıştırıcı hale gelecek, bu da birçok soruna ve işte genel bir yavaşlamaya yol açacaktır.

İç mimariyi anlamıyorsun. Programların nasıl etkileştiğini bilmiyorsunuz, parametre değerlerini türlerine ve özelliklerine göre değiştiriyorsunuz. Önerdiğiniz şey, her şeyi çok daha karmaşık ve kafa karıştırıcı hale getirecek. Ve iletişim sorununu çözmez. Hala bir koltuk değneği olarak kalacak.

Nikolay Semko :

...

Ayrıca, OBJPROP_TEXT özelliği aracılığıyla, maksimum 63 bayt boyutunda bir dize aktarabilirsiniz. Hiçbir şey hakkında değil.

Örneğiniz tamamen anlamsız olsa da, onu yalnızca gösterim için daha doğru bir şeye dönüştürdüm ve 63 bayt boyutunda 1000 farklı dizeyi kopyalarken olan buydu:

...

Bir MT nesnesinin açıklaması aracılığıyla 64 karakterlik bir dizi aktarabilirsiniz. Yeter. Verileri büyük tablolara iletmek için 20-30 satıra ihtiyacım var. Büyük tablolar olmadan, maksimum 2-3 sıraya ihtiyacınız vardır.

Şu anda MT4 ile ilgileniyorum.

MT5 her zaman gelişiyor. Geliştiriciler, MT programlarının paylaşılan belleğini ekleyebilir (böylece kaynaklarla uğraşmak zorunda kalmazlar) ve sorun ortadan kalkar.

 

Nikolai Semko :

...

Mesajım, çift, uzun, zaman, int vb. İletmek için dizeleri kullanmayı bırakmaktı.

...

Ve double, long, time, int vb. nasıl gönderilir? ???

Aynı şekilde, bir kaynağa yazmak için bir dizeye ve ardından char'a çevirmeniz gerekir.

Yoksa lparam,dparam üzerinden mi öneriyorsunuz?

Yani olay kuyruğunu aşırı yüklemek...

 
Реter Konow :


Teneke. Bu konunun dışındayım.
Anaokulu, ikinci çeyrek.
Beni cehaletiniz ve cehaletiniz ile, kendi öneminiz ve haklılığınız konusunda karşı konulmaz bir hisle yordunuz Peter.
 
Nikolai Semko :


Ve ölçümlerinizde, kaynağı kaydetmek ve okumak için zaman eklemeyi unuttunuz...

Yani 1000 satır yazarken bile (ki bunlar kaynak üzerinden aktarmak gerçekten daha iyidir), kaynaktan tasarruf ve geri alma maliyetinden dolayı hızlı bir şekilde kazanamazsınız.