2013-07-23 6 views
20

हास्केल रन टाइम प्रदर्शन के मुद्दों डीबगिंग के लिए कई शानदार टूल हैं की वजह से मुद्दों संकलन है, लेकिन क्या उपकरण/अंगूठे का नियम संकलन समय प्रदर्शन के मुद्दों डीबगिंग के लिए मौजूद हैं?डिबगिंग समय प्रदर्शन GHC की बाधा solver

विशेष रूप से, मेरे कुछ कोड में बाधा सॉल्वर हमेशा के लिए ले रहा है (1-2 सेकंड से कई मिनट तक)। मुझे पूरा यकीन है कि यह बाधाओं में प्रकार के परिवारों का उपयोग कैसे कर रहा है, लेकिन मुझे नहीं पता कि इस संदर्भ में किस प्रकार की चीजें महंगे हैं या यह देखने के लिए कि बाधा सॉल्वर अपना समय कहां खर्च कर रहा है। मेरा सबसे अच्छा अनुमान यह है कि टाइप सूचियों पर मेरे संचालन में से एक रैखिक के बजाय वर्गबद्ध समय ले रहा है।

चलो एक उदाहरण देखें कि मुझे बाधा हल करने का संदेह क्यों है।

class ExampleClass a where 
    type ExampleType a 
    f :: ExampleType a -> a 

data ExampleData (xs :: [a]) = ... 

instance 
    (Constraint1 
    , Constraint2 
    , ... 
    ) => ExampleClass (ExampleData xs) 
     where 
    type ExampleType (ExampleData xs) = Int 
    f = undefined 

जब मैं बहुत जल्दी GHCi में इस फ़ाइल

ghci> :l Example.hs 

संकलन होता है लोड, बहुत 1 से भी कम समय दूसरा: मेरे फ़ाइलों में, मैं कोड की तरह दिखता है। फिर, मैं निम्न पंक्ति निष्पादित करें:

ghci> let test = f Int :: ExampleData 

कोई वास्तविक गणना चल रहा है, लेकिन यह अभी भी एक बहुत लंबे समय लेता है। ExampleData की घटना घोषणा में अधिक बाधाएं, जितनी देर लगती है। (वास्तव में बाद में परीक्षण का मूल्यांकन तुरंत होता है।) इन प्रदर्शन समस्याओं को डीबग करने का सबसे अच्छा तरीका यह है कि बाधाओं को एक-एक करके टिप्पणी करना और यह देखना कि कौन से प्रदर्शन प्रदर्शन को प्रभावित कर रहे हैं। लेकिन यह बहुत समय ले रहा है, और जब उन बाधाओं में जटिल प्रकार के परिवार शामिल होते हैं, तो यह वास्तव में जानकारीपूर्ण नहीं है।

तो, क्या इस समस्या को डीबग करने के लिए मैं एक बेहतर दृष्टिकोण ले सकता हूं?


संपादित करें: यह पता चला है कि मैंने bug in GHC खोजा है। बग से जुड़ी एक स्क्रिप्ट है जो दर्शाती है कि बाधा सॉल्वर रैखिक होने वाले इनपुट पर वर्गबद्ध समय ले रहा है।

+0

मुझे लगता है कि आपने जीएचसी को प्रोफाइलिंग के साथ चालू करने और उसका उपयोग करने के साथ संकलन करने का प्रयास किया है? –

+0

@ बॉयडस्टेफेनस्मिथर। मैंने कभी भी जीएचसी संकलित नहीं किया है, संकलन के साथ अकेले रहने दें। क्या इस सुविधा का उपयोग करने के बारे में कोई ट्यूटोरियल है? –

+1

[बिल्डिंग जीएचसी] (http://ghc.haskell.org/trac/ghc/wiki/building) शायद एक अच्छा संसाधन है, और जीएचसी बेंचमार्किंग पर भी एक अनुभाग है हालांकि मुझे नहीं पता कि इसमें प्रोफाइलिंग शामिल है या नहीं। –

उत्तर

7

इसके लायक होने के लिए, आप एक समय में बाधाओं का मूल्यांकन कर सकते हैं: दयालु! यह देखने के लिए कि उन्हें अलग-अलग टिप्पणी करने की आवश्यकता के बजाय, कितना समय लगता है।

संबंधित मुद्दे