Standart özelliklerin/yaklaşımların alternatif uygulamaları - sayfa 11

 
Nikolai Semko :
linki bırak lütfen

Kaydetmedi. Burada forumda bahsedildi. Arama motorlarından araştırdım.

Вопрос к сообществу программистов по поводу авторства
Вопрос к сообществу программистов по поводу авторства
  • 2017.11.24
  • www.mql5.com
Общее обсуждение: Вопрос к сообществу программистов по поводу авторства
 
fxsaber :

Kaydetmedi. Burada forumda bahsedildi. Arama motorlarından araştırdım.

Gördüm. Piksel renklerini karıştırmadan orada her şey çok ilkel.
Sadece forumlarda tanıştığım her şey anaokulu seviyesindeydi. Ve ben zaten 5. sınıftayım.
 
Nikolai Semko :
Sadece forumlarda tanıştığım her şey anaokulu seviyesindeydi. Ve ben zaten 5. sınıftayım.

Tüm bu bisikletlerin bir zamanlar birçok kez yeniden yapıldığı açıktır. Asm-uygulamalarına kadar kitaplar bile çıktı.

Şimdi temelleri bulmak zor çünkü. hemen hemen herkes, tüm durumlar için uygun API'leri kullanır.

Bu nedenle, forumlara kaydolmanız ve sormanız yeterlidir.

 
fxsaber :

Tüm bu bisikletlerin bir zamanlar birçok kez yeniden yapıldığı açıktır. Asm-uygulamalarına kadar kitaplar bile çıktı.

Şimdi temelleri bulmak zor çünkü. hemen hemen herkes, tüm durumlar için uygun API'leri kullanır.

Bu nedenle, forumlara kaydolmanız ve sormanız yeterlidir.

Olay bu, zor. Her neyse, bulamadım. Belki de iyi aramadım. Forumlarda herkes standart kapalı kütüphanelere gönderilecek ve her şey oradayken bunun neden gerekli olduğunu merak edecek. Java, JavaScript vb. ile yazsaydım elbette beynimi yıkamazdım. veya pazara ihtiyaç duyulmadıysa.
Tamam, bu meselede hâlâ mükemmel bir yalnızlık içinde olduğum gerçeğine zaten alıştım. Devam edeceğim, özellikle bu yönde hemen hemen her uygulamanın anlaşılmasında neredeyse hiç beyaz noktam olmadığı için. Ama benzersiz beceriler kazandı.
 
pavlick_ :

Neden LONG_MAX/MIN kullanmıyorsunuz? Bir şekilde daha iyi görünecek. Hiçbir şeye benzemiyor. Testlerinizi gcc üzerinde çalıştırdım (minik bir değişiklikle, elbette derleyici çok eski 5.4.0'dır ki bu da elinizin altındaydı):


Evet, güzel değil. Ancak LONG_MAX = 9223372036854775807, 9007199254740992'den büyüktür. sadece ulong tipi için görülebilir. Nasıl daha iyi hale getireceğimi bile bilmiyorum. (ulong)(1<<53) yazmayın, çünkü bu zaman alan bir işlemdir.

Double türü, LONG_MAX değerinden değil, mümkün olan maksimum mantisten kesirli bir parçası olmayan tamsayıları içermeye başlar. Ve mantis için 53 bit ayrılmıştır, yani. 2^53=9007199254740992.

pavlick_ :

Kodunuzda, zaman hesaplaması önemsizdir - çıktı milisaniye cinsindendir (nano değil) ve hala eksi t0'ın neden gerekli olduğunu anlamıyorum.

t0, basit çift toplamın 1000000 geçişlik tam döngüsünün zamanıdır.

ve t, aynı çift değerlerin toplamının aynı döngüsünün zamanıdır, ancak tavan, Tavan, yuvarlak vb. işlevlerden geçer.

Farkın (t-t0) bu fonksiyonlar için harcanan net zaman olduğu mantığından hareket ettim.

Tabii ki, daha fazla objektiflik ancak birkaç ölçüm alarak elde edilebilir.

- nano'da 1.000.000 fonksiyondan birinin yürütme süresine göre hesaplıyorum, nano'da doğru.

pavlick_ :

Testlerinizi gcc üzerinde çalıştırdım (minik bir değişiklikle, elbette derleyici çok eski 5.4.0'dır ki bu da elinizin altındaydı):

1. -O3 ile derleme

2. -Ofast ile Derleme

Bu işe yarayan bir şey. Bu derlenmiş MQL5 kodu, Ofast'tan bile daha mı hızlı? İnanması zor. Muhtemelen orada 32 bitlik bir derleyiciniz vardı.
 
Nikolai Semko :

(ulong)(1<<53) yazmayın, çünkü bu zaman alan bir işlemdir.

Bu işlem, dizeler dahil sabitleri olan tüm işlemler gibi zaman almaz.

 input long l = ( ulong ) 1 << 53 ;
input string s = ( string ) __DATETIME__ + __FILE__ ;
 
fxsaber :

Bu işlem, dizeler dahil sabitleri olan tüm işlemler gibi zaman almaz.

Vay havalı! Teşekkür ederim. Ve düşündüm - her zaman önemlidir. Evet, mantıklı, derleme aşamasında zaten hesaplayabilirsiniz.
Sonra şöyle:

 double Ceil ( double x) { return double ((x>( long ) 1 << 53 || x<-( long ) 1 << 53 )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((x>( long ) 1 << 53 || x<-( long ) 1 << 53 )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((x>( long ) 1 << 53 || x<-( long ) 1 << 53 )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}
 2018.08 . 26 18 : 04 : 07.638 TestRound (EURUSD,M1)   Время цикла без округления = 1.302 наносекунд, сумма = 115583114403605978808320.00000000
2018.08 . 26 18 : 04 : 07.642 TestRound (EURUSD,M1)   Время выполнения функции ceil =   2.389 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.644 TestRound (EURUSD,M1)   Время выполнения функции Ceil =   0.223 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.648 TestRound (EURUSD,M1)   Время выполнения функции floor = 2.884 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.649 TestRound (EURUSD,M1)   Время выполнения функции Floor = 0.122 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.654 TestRound (EURUSD,M1)   Время выполнения функции round = 3.413 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.656 TestRound (EURUSD,M1)   Время выполнения функции Round = 0.222 наносекунд, Контрольная сумма = 1.15583114403606 e+ 23
2018.08 . 26 18 : 04 : 07.656 TestRound (EURUSD,M1)   Идет бесконечный поиск расхождения по случайным числам double ... Прервите скрипт, когда надоест ждать

Doğru, 53 yerine DBL_MANT_DIG yazmak daha doğru olur.

 double Ceil ( double x) { return double ((x>( long ) 1 << DBL_MANT_DIG || x<-( long ) 1 << DBL_MANT_DIG )?x:(x-( long )x> 0 )?( long )x+ 1 :( long )x);}
double Round( double x) { return double ((x>( long ) 1 << DBL_MANT_DIG || x<-( long ) 1 << DBL_MANT_DIG )?x:(x> 0 )?( long )(x+ 0.5 ):( long )(x- 0.5 ));}
double Floor( double x) { return double ((x>( long ) 1 << DBL_MANT_DIG || x<-( long ) 1 << DBL_MANT_DIG )?x:(x> 0 )?( long )x:(( long )x-x> 0 )?( long )x- 1 :( long )x);}

Tüm çift değerler kesirli ise minimum kazanma durumu.

 2018.08 . 26 18 : 20 : 35.408 TestRound (EURUSD,M1)   Время выполнения функции sqrt = 1.083 наносекунд, сумма = 81969849.90928555
2018.08 . 26 18 : 20 : 35.413 TestRound (EURUSD,M1)   Время выполнения функции ceil =   3.579 наносекунд, Контрольная сумма = 5250492895.0
2018.08 . 26 18 : 20 : 35.416 TestRound (EURUSD,M1)   Время выполнения функции Ceil =   1.249 наносекунд, Контрольная сумма = 5250492895.0
2018.08 . 26 18 : 20 : 35.422 TestRound (EURUSD,M1)   Время выполнения функции floor = 3.931 наносекунд, Контрольная сумма = 5249492896.0
2018.08 . 26 18 : 20 : 35.424 TestRound (EURUSD,M1)   Время выполнения функции Floor = 0.513 наносекунд, Контрольная сумма = 5249492896.0
2018.08 . 26 18 : 20 : 35.427 TestRound (EURUSD,M1)   Время выполнения функции round = 1.519 наносекунд, Контрольная сумма = 5249992896.0
2018.08 . 26 18 : 20 : 35.429 TestRound (EURUSD,M1)   Время выполнения функции Round = 0.571 наносекунд, Контрольная сумма = 5249992896.0
Dosyalar:
TestRound.mq5  11 kb
 
Nikolai Semko :
Bu işe yarayan bir şey. Bu derlenmiş MQL5 kodu, Ofast'tan bile daha hızlı mı? İnanması zor. Muhtemelen orada 32 bitlik bir derleyiciniz vardı.

Her yerden eksi t0 attım (bir tür hata olduğunu düşündüm) ve çıktımda sadece bir geçiş değil, tüm döngü donmuştu. Bunu yineleme başına nanosaniye cinsinden çıktı biçiminize getirirsek (ilk satırda "Yuvarlamasız döngü süresi" - hesaplama yöntemi bizim için aynıdır), o zaman şunu elde ederiz:

-O3
Время цикла без округления = 1.099 наносекунд, сумма = 1.15583114 e+ 23
-Ofast
Время цикла без округления = 0.552 наносекунд, сумма = 1.15583114 e+ 23

gcc'de özel bir hızlanma yoktur (ve hatta -Ofast'ta daha yavaştır). Testinize göre µl başına anlamlıdır, ancak:

1'000'000 üzerinden 985'651'iniz var, yani hemen hemen tüm yinelemeler x < MIN || koşulunu karşılar. x > MAKS.


-Ofast, inf/nan için tüm kontrolleri devre dışı bırakır, errno ayarını yapar, yani fpu üzerinde çıplak yuvarlama kalır. Ve bu çıplak yuvarlama, en basit karşılaştırma ile aşılamaz x < MIN || x > MAKS.

 
pavlick_ :

Gcc'de özel bir hızlanma yoktur (ve hatta -Ofast'ta daha yavaştır). µl başına önemli

Nasıl söylenirse de. Güzel sayılar için t0 attık ve 20 kat fark elde ettik. Bir döngü (+t0) biçimindeki minimum ek kod bile, iki kez bölgede birkaç düzine kat daha az çekici güzel bir sonuç yapar. Ve eğer bu bir çıplak döngü değil de faydalı bir şeyler yapan gerçek bir algoritmaysa ne söyleyebilirim? Evet, fark hiç görünmeyecek, ondalık noktadan sonra bir yerde kalacak ve bir darboğaz olması muhtemel değil. Gerçek bir uygulamada, bir muteks, CPU engelleri almak, bellek ayırmak yuvarlamadan çok daha pahalıdır. Genel olarak, IMHO, muma değmez.

 
pavlick_ :

Evet, fark hiç görünmeyecek, ondalık noktadan sonra bir yerde kalacak ve bir darboğaz olması muhtemel değil. Gerçek bir uygulamada, bir muteks, CPU engelleri almak, bellek ayırmak yuvarlamadan çok daha pahalıdır. Genel olarak, IMHO, muma değmez.

Bu, zamanın %99'unda doğrudur, evet.

Optimize etmeden önce, neyin optimize edileceği konusunda endişelenmeye değer.

Uygulamamda, kendi atof uygulamamın gerçekten yardımcı olduğu tek bir vakayı hatırlıyorum. Öyle görünse de.

Ve herhangi bir optimizasyonun (optimizasyon *** hariç) hiçbir şekilde ücretsiz olmadığını hatırlamakta fayda var.