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

 
Maxim Kuznetsov :

Ve evet, MQL'de metin ayrıştırma hala bir zevktir :-) Peki, metin işleme için tasarlanmamıştır. Yani, yapabilirsin, ama bu @oops..

Diziler, siparişler - bu MQL'nin yoludur

İşte bundan bahsediyoruz... :)

 
Nikolai Semko :

Çok yönlülük genellikle yavaşlıkla eş anlamlıdır ve hatta daha çok tanga ile eş anlamlıdır.
Bir örnek vereceğim.

Bir keresinde WebRequest kullanarak bir kripto borsasından alınan bir dizgiyi ayrıştırıyordum. Ve kendisi tarafından "yüksek hızlı C ++ kitaplığından" taşınan Sergeev JSON kitaplığı aracılığıyla ayrıştırma gerçekleştirdi. Ve hızın bir şekilde çok yetersiz olduğunu fark ettim. Orada her şey "evrensel" çizgilerle gerçekleştirildi.

Düşük hızın sebebinin stringler olduğunu anladım ve string fonksiyonlarını kullanmaktan kurtulmak istedim ve direkt olarak uchar dizisinden bir parsing fonksiyonu yazdım. Sonuç beni çok şaşırttı. Ayrıştırma hızım .... (drumroll) 800 kat daha hızlıydı. Tüm dizeyi JSON aracılığıyla ayrıştırmak 0,3 saniye sürdüyse, işlevim aracılığıyla yarım milisaniyeden az sürdü.

İşte benim uchar dizisi aracılığıyla yaptığım ayrıştırma örneği.

Teklifinizin özü aşağıdaki gibidir:

  1. Bir dize (640 karakter) alıyoruz, onu StringToChar() işlevine gönderiyoruz;
  2. Bir dizi alıyoruz ve onu bir kaynakta saklıyoruz.
  3. İkinci diziye ResourceReadImage() kullanarak ikinci taraftaki kaynağın içeriğini alıyoruz.
  4. İkinci diziyi CharArrayToString()'e gönderiyoruz ve son dizgiyi alıyoruz.
  5. Ardından stringi sınırlayıcıya bölüp parametre değerlerini çekirdeğe yazıyoruz.

Başlangıçta dizeleri iletmek için MT nesnelerini kullanmak istedim.

  1. Bir dize (640 karakter) alıyoruz ve onu her biri 64 karakterlik parçalara ayırıyoruz.
  2. Bağlantı nesneleri arasında dolaşıyoruz ve dizenin parçalarını açıklamalarına yazıyoruz.
  3. İkinci tarafta, bağlantı nesneleri arasında dolaşıyoruz, dizenin parçalarını alıyoruz ve her bir parçayı ayırıcı ile bölerek parametre numarasını ve değerini çıkarıyoruz.
  4. Parametre değerlerini çekirdeğe yazıyoruz.

Başlangıçta ikinci seçeneğin daha hızlı olduğunu düşündüm.

Benim kadar çok problemle çalışırken, bir çözüm seçerken sezgiye güvenmek zorundasın. Hayat her şeyi iyice kontrol etmeye yetmez. Kararların yönünü seçerken ya bir ekibe ya da mükemmel bir içgüdüye ihtiyacınız var. Ve elbette, profesyonellikten fedakarlık etmeli ve bilgi boşluklarına katlanmalısınız. Aksi takdirde, el sanatları ile uğraşmaya devam edecek (profesyonel olarak sürülse de) ve mega projeyi asla bitirmeyecektir. Bu gerçeklik.

 
Реter Konow :

Teklifinizin özü aşağıdaki gibidir:

  1. Bir dize (640 karakter) alıyoruz, onu StringToChar() işlevine gönderiyoruz;
  2. Bir dizi alıyoruz ve onu bir kaynakta saklıyoruz.
  3. İkinci diziye ResourceReadImage() kullanarak ikinci taraftaki kaynağın içeriğini alıyoruz.
  4. İkinci diziyi CharArrayToString()'e gönderiyoruz ve son dizgiyi alıyoruz.
  5. Ardından stringi sınırlayıcıya bölüp parametre değerlerini çekirdeğe yazıyoruz.

tam olarak değil.
meşgulken - açıklamaya zaman yok.

Kodumu detaylı bir şekilde incelerseniz beyaz nokta kalmaz, o zaman kendiniz için birçok keşif yapmış olursunuz.
not. Sadece bir hata ayıklayıcı kullanılmadan bunu anlamak çok daha zor olacaktır. Kullanmaya başlayıp başlamadığınızı veya bu önemli aracı hala kullanmadığınızı bilmiyorum.

 
Nikolai Semko :

...

Kodumu detaylı bir şekilde incelerseniz beyaz nokta kalmaz, o zaman kendiniz için birçok keşif yapmış olursunuz.
not. Sadece bir hata ayıklayıcı kullanılmadan bunu anlamak çok daha zor olacaktır. Kullanmaya başlayıp başlamadığınızı veya bu önemli aracı hala kullanmadığınızı bilmiyorum.

Yarın kodunuza daha yakından bakacağım. (Zaman dilimlerini unutmayın)

Belki kendim için yeni bir şeyler keşfederim. ))

 

Herhangi bir yapı bir dizedir. Yapı dizisi, biçimlerinin açıklamasını içeren bir dizi dizidir. Bir sınıf bir yapı ve yöntemlerdir, bir sınıf uygulaması bir dizi uygulamadır (Fransızcamı bağışlayın).

Son ana kadar hiçbir şeyi dönüştürmeye gerek yoktur. Burada sadece dizeler söz konusudur. Basitçe normalleştirilirler: biri 2 veya 4 bayt alır ve biri - 1, bu nedenle hizalamanız gerekir.

ZY Bu yaklaşımı ilk kez yaklaşık olarak 1993 yılında Clarion DBMS'de uygulamıştır. Her şey çok hızlı çalıştı.

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

Herhangi bir yapı bir dizedir. Yapı dizisi, biçimlerinin açıklamasını içeren bir dizi dizidir. Bir sınıf bir yapı ve yöntemlerdir, bir sınıf uygulaması bir dizi uygulamadır (Fransızcamı bağışlayın).

Son ana kadar hiçbir şeyi dönüştürmeye gerek yoktur. Burada sadece dizeler söz konusudur. Basitçe normalleştirilirler: biri 2 veya 4 bayt alır ve biri - 1, bu nedenle hizalamanız gerekir.

ZY Bu yaklaşımı ilk kez yaklaşık olarak 1993 yılında Clarion DBMS'de uygulamıştır. Her şey çok hızlı çalıştı.

yaklaşık aynı zamanda aynı :-) Bir okul... bu arada, DBMS fena değildi ve birçok yönden zamanının ilerisindeydi.

PS/, arka planda "her şey bir satır/metindir" kavramı düzeyinde sevilen bir gıdıklamadır. Gerçek piton hızı

 
Реter Konow :

Yarın kodunuza daha yakından bakacağım. (Zaman dilimlerini unutmayın)

Belki kendim için yeni bir şeyler keşfederim. ))

belki bu hala yararlıdır

TF değiştirilirken değerini yeniden başlatmayan double örneğinde bir kaynak değişkeni kullanan bir gösterge örneği. Terminal global değişkenlerine daha uygun bir alternatif. Globallerle aynı şekilde, çeşitli veri yapılarını ve bu yapıların dizilerini kullanabilirsiniz.

Dosyalar:
 
Nikolai Semko :

belki bu hala yararlıdır

)

 
Реter Konow :
İlgi uğruna, sendika seçeneğini deneyeceğim. Ve CharArrayToString ve StringToCharArray ile. Her ne kadar içgüdüm bana MT nesnelerinin tanımı yoluyla iletişimden daha hızlı olmanın pek mümkün olmadığını söylüyor. Ancak yanılıyor olabilirim. Göreceğiz...

Peter, başlangıçta bir oyun yaptın ve şimdi oyununun içindeki mesajlaşma performansından bahsediyorsun. Anlıyorsunuz: string sadece uygun bir ***, başka bir şey değil. Herhangi bir veri gerçekten sadece bellekteki bir bayt koleksiyonudur. Bu nedenle, doğrudan baytlarla çalışmanız önerilir ve her zaman olduğu gibi inatçısınız, aynı dizenin aynı bayt dizisi olduğunun farkında değilsiniz. Bu nedenle, bir dizeyi bir uchar dizisine dönüştürerek hiçbir şey kaybetmezsiniz, ancak bir dizeyi ayrıştırırken performansınız gerçekten düşer. Bu nedenle, tüm sezgileriniz genellikle geçmiştir.

 
Vasiliy Sokolov :

1. Peter, başlangıçta bir oyun yaptınız ve şimdi oyununuzun içindeki mesajlaşma performansından bahsediyorsunuz.

2. Anlıyorsunuz: string sadece uygun bir ***, başka bir şey değil. Herhangi bir veri gerçekten sadece bellekteki bir bayt koleksiyonudur. Bu nedenle, doğrudan baytlarla çalışmanız önerilir ve her zaman olduğu gibi inatçısınız, aynı dizenin aynı bayt dizisi olduğunun farkında değilsiniz. Bu nedenle, bir dizeyi bir uchar dizisine dönüştürerek hiçbir şey kaybetmezsiniz, ancak bir dizeyi ayrıştırırken performansınız gerçekten düşer.

3. Bu nedenle, tüm sezgileriniz genellikle geçmiştir.

1. "Oyun" - bu durumda, bu sizin anlayışınızdır, benim yaptığım şey değil. Bir motorun ne olduğunu ve ne olduğunu anlamanız 75 sayfa sürdü. Anlayın: Kusurlar ve hatalar özü karakterize etmez. Hiçbir öz biçimi özün kendisini karakterize etmez . Nasıl giyindiğiniz, nasıl bir insan olduğunuzu belirlemez. Sadece yanlış düşünme, bütünü özele göre yargılar.

2. Bu benim için zaten açık. StringToChar işlevini kullanarak gerçekten hız artışı olacak mı, bugün kontrol edeceğim.

3. Sezgilerimi her gün kontrol ederim. Her gün şüphe ediyorum. Ve doğru. Başarısız olursa, Akıl tarafından yönlendirilmeniz gerekir. Ancak Akıl, her zaman ona güvenemeyecek kadar sınırlı, kibirli ve aptaldır. Bu nedenle, sezgi tek alternatiftir. Eğer neden bahsettiğimi anladıysan...

Neden: