answering a question with a suggestion to use GADTs olduğunda, performansla ilgili bazı sorular yorumlarda ortaya çıktı. soru typeclass PlotValue
yer:GADT'lerin kullanılmasının performans sonuçları
class PlotValue a where
value :: a -> Double
ve cevabım bir GADT Input
kullanarak önerdi:
data Input where
Input :: (PlotValue a, PlotValue b) => Maybe a -> Maybe b -> Input
ancak ayrıntılar herhalde, önemsizdir. İki Maybe
eşleşen Normal maliyetler üzerinde
case x of
Input (Just a) (Just b) -> value a * value b
_ -> 0.0
gibi ve yukarıda bir desen maçı uğradıkları herhangi bir çalışma zamanı maliyet var mı :
Zaman:
Ben performansının yaklaşık iki yönlerini merak ediyorum değerler?
Uzay: Ne kadar depolama havai yapar tip Input
taşıma değeri? Benim tahminim, Input
(her biri 'pointer') türünde her bir değer için iki PlotValue
sözlükleri taşımasıdır, yani [Input]
bellek kullanımı açısından (Just Double, Just Double)
kullanmaktan çok daha verimsiz olacaktır, ya da daha iyisi, (# #Double, #Double #)
- value
sonuçlarını normal veya paketlenmemiş bir şekilde saklarsanız.
Bu yüzden, GADT'lerin bana ifade vericiliğini sevmeme rağmen, performans özelliklerini çok fazla düşünmedim. Bana bu konuda daha fazla şey anlatabilir miyim (ve bilmediğim diğer gizli maliyetler)?
Ancak, benzer bir deyim, OOP ve son sınıf olmayan nesnelerin nesneleri (bir yönteme geçirilen her nesne, sanal yöntem tablosuna veya eşdeğerine bir göstericiye ihtiyaç duyar) için doğrudur ve C++ veya Java, yeterince yüksek performansa sahiptir. uygulamalar. Tabii ki bu iki dilde de performans için bazı şeyler için OO olmayan şeyleri diziler gibi kullanacaksınız. Açık sözlü yorum, ama onu perspektif içinde koymak istedim. –
Cevabınız için teşekkürler, şüphelerimi onaylayın! '(*)' Ifadesi, her zaman "Çift" -> Çift -> Çift "türünde kullanıldığı gibi bana benziyor, çünkü" değer "sonucu bir" Çift ", ancak -" değer "olacak her zaman değerlendirir ve pahalı olabilir (bir String’i ayrıştırma gibi) bu yüzden burada düz 'Double's çok daha iyisini yapar. – yatima2975