تهيج وظائف typeclass في إخراج profiler GHC
-
25-09-2019 - |
سؤال
عند تحديد ملامح برنامج Haskell المكتوب في GHC ، يتم تشويه أسماء وظائف typeclass في ملف .prof لتمييز تطبيقات مثيل لها عن آخر. كيف يمكنني تشكيل هذه الأسماء لمعرفة أي مثيل النوع؟
على سبيل المثال ، افترض أن لدي البرنامج التالي ، حيث الأنواع Fast
و Slow
كلاهما ينفذ Show
:
import Data.List (foldl')
sum' = foldl' (+) 0
data Fast = Fast
instance Show Fast where
show _ = show $ sum' [1 .. 10]
data Slow = Slow
instance Show Slow where
show _ = show $ sum' [1 .. 100000000]
main = putStrLn (show Fast ++ show Slow)
أنا أتجمع مع -prof -auto-all -caf-all
وركض مع +RTS -p
. في ملف .prof الذي يتم إنشاؤه ، أرى أن مراكز التكلفة الأعلى هي:
COST CENTRE MODULE %time %alloc
show_an9 Main 71.0 83.3
sum' Main 29.0 16.7
وفي الشجرة ، أرى بالمثل (حذف الخطوط غير ذات الصلة):
individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc
main Main 232 1 0.0 0.0 100.0 100.0
show_an9 Main 235 1 71.0 83.3 100.0 100.0
sum' Main 236 0 29.0 16.7 29.0 16.7
show_anx Main 233 1 0.0 0.0 0.0 0.0
كيف يمكنني معرفة ذلك show_an9
هو Slow
تنفيذ show
و لا Fast
'س؟
المحلول
لا لا يمكنك. ال _an9
و _anx
يتم إنشاء الأجزاء بشكل عشوائي. (عندما أتجمع مرة أخرى حصلت _ane
و _anC
.)
يمكنك استخدام SCC
(Set-Cost-Center) Pragma لإدراج مركز التكلفة يدويًا:
data Fast = Fast
instance Show Fast where
show _ = {-# SCC "show(Fast)" #-} show $ sum' [1 .. 10]
data Slow = Slow
instance Show Slow where
show _ = {-# SCC "show(Slow)" #-} show $ sum' [1 .. 100000000]
يجب أن يظهر الملف الشخصي:
main
show_an9
show(Slow)
sum'
show_anx
show(Fast)
لا تنتمي إلى StackOverflow