2011-03-24 22 views
9

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)?

cevap

13

Sanırım havai yükleri kırdın. Varoluşsal olarak kalifiye her değişken için, karşılık gelen (işaretçi) sözlüklere ihtiyacınız vardır. Bu boşluk alır ve daha kötüsü, yöntem çağrıları yavaş olacaktır. Örneğinizdeki (*) dolaylı bir işlev çağrısı olurken, Double ile ilkel bir op olacaktır.

+2

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. –

+2

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

İlgili konular