سؤال

عند تحديد ملامح برنامج 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top