2008-12-10 16 views

उत्तर

1

फ्लेक्स बिल्डर 3 में performance and memory profiler शामिल है। मैंने इसका इस्तेमाल नहीं किया है, लेकिन यह बहुत अस्पष्ट दिखता है। मुझे यकीन नहीं है कि इसका उपयोग गैर-फ्लेक्स सामग्री के लिए किया जा सकता है, लेकिन यह निश्चित रूप से केवल AS3 के लिए काम करेगा।

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

जब बाधाएं प्रतिपादन में हों, तो कोशिश करने वाली पहली बात यह है कि आप अपने लक्ष्य एफपीएस पर आसानी से प्रकाशित हो जाएं और वास्तविक प्लेबैक नीचे (लक्ष्य हार्डवेयर पर) होने पर ट्रैक करने के लिए एक एफपीएस मीटर का उपयोग करें। आप प्रतिपादन के बारे में अधिक विस्तृत जानकारी प्राप्त कर सकते हैं, उदाहरण के लिए, 1ms टाइमआउट का आह्वान करना जो refreshAfterUpdate पर कॉल करता है, और रीफ्रेश के बीच वास्तविक समय की निगरानी करता है। दुर्भाग्य से आप "प्रति ताज़ा" की तुलना में और अधिक बारीक नहीं हो सकते हैं - आप सीधे देख नहीं सकते कि कितना समय रास्टरराइजिंग, कंपोजिटिंग इत्यादि खर्च किया जाता है (हालांकि आप अक्सर इन चीजों का अनुमान लगा सकते हैं। उदाहरण के लिए, आप बिटमैप कैशिंग को सक्षम कर सकते हैं तालिका से रास्टरराइजेशन लेने के लिए वेक्टर-भारी ऑब्जेक्ट्स पर, और परिणामों का निरीक्षण करें।)

+0

वह लिंक फ्लेक्स बिल्डर 3 फीचर परिचयों को इंगित करता है - क्या यह वर्तमान संस्करण नहीं है? – hasseg

+0

वाह, आप सही हैं - आप देख सकते हैं कि मैं एक एफबी उपयोगकर्ता नहीं हूं। मैं स्पष्टता के लिए संपादित करूंगा, लेकिन शायद एफबी प्रोफाइलर से अधिक परिचित कोई भी इंस और आउट के बारे में जानकारी जोड़ सकता है। पकड़ने के लिए धन्यवाद! – fenomas

2

यह ध्यान रखना महत्वपूर्ण है कि फ्लैश प्लेयर कार्यान्वयन प्रत्येक प्लेटफ़ॉर्म पर और प्रत्येक ब्राउज़र पर एक हद तक अलग है, इसलिए उल्लेखनीय गति अंतर की उम्मीद है। इसलिए यदि आप संसाधन गहन आवेदन विकसित कर रहे हैं तो आपको प्रत्येक ओएस के लिए विशिष्ट प्रोफाइलिंग टूल का उपयोग करना चाहिए, उदाहरण के लिए ओएस एक्स पर Instruments और निश्चित रूप से प्रत्येक ब्राउज़र में प्रदर्शन का परीक्षण करें।

2

मैंने प्रोफेसर का उपयोग किया है जो फ्लेक्स बिल्डर 3 के साथ मध्यम सफलता के साथ आता है। मुझे स्मृति लीक और जीसी मुद्दों को खोजने में विशेष रूप से उपयोगी लगता है।

प्रश्न में आवेदन की असीमित प्रकृति और [ऑन एंटरफ्रेम] और अन्य आंतरिक तरीकों को दिए गए समय की मात्रा के कारण समय-समय पर प्रदर्शन के क्षेत्र में मेरे लिए यह बहुत कम उपयोगी था, हालांकि मैं अभी भी था आउटपुट के आधार पर कुछ अनुकूलन करने में सक्षम।

16

मैं एएस के लिए एक प्रोफाइलर भी ढूंढ रहा था, लेकिन मैं एक फ्रीवेयर/ओपन सोर्स समाधान चाहता था जो फ्लैशडिवेल और फ्लेक्स एसडीके के साथ काम करता है। मुझे कोई नहीं मिला। इसलिए मैंने एक साधारण पायथन लिपि और एक सरल एएस कक्षा भी लिखी। लिपि अनिवार्य रूप से किसी भी एएस फ़ाइल लेता है और प्रत्येक फ़ंक्शन परिभाषा के लिए flash.utils.getTimer() कॉल का संकल्प - 1 एमएस की सटीकता के साथ उस फ़ंक्शन के कुल रनटाइम को मापने के लिए प्रोफाइल कॉल जोड़ता है। स्क्रिप्ट कभी-कभी गलती करता है, लेकिन आमतौर पर हाथ से ठीक करना आसान होता है। फिर आपको मैन्युअल रूप से एक और पंक्ति जोड़ने की आवश्यकता है: किसी बिंदु पर प्रोफाइलिंग आंकड़ों को कहीं भी डंप करें। यह विधि स्पष्ट रूप से सटीक से बहुत दूर है, लेकिन फिर भी यह आपको अपने कोड में बाधाओं का अच्छा अनुभव देता है। मैंने सफलता के साथ 100k फ़ाइल के लिए इसका इस्तेमाल किया।

package { 
    public class Profiler { 
     private static var instance:Profiler; 

     public static function get profiler():Profiler { 
      if (!Profiler.instance) Profiler.instance = new Profiler; 
      return Profiler.instance; 
     } 

     private var data:Object = {}; 

     public function profile(fn:String, dur:int):void { 
      if (!data.hasOwnProperty(fn)) data[fn] = new Number(0); 
      data[fn] += dur/1000.0; 
     } 

     public function clear():void { 
      data = { }; 
     } 

     public function get stats():String { 
      var st:String = ""; 
      for (var fn:String in data) { 
       st += fn + ":\t" + data[fn] + "\n"; 
      } 
      return st; 
     } 
    } 
} 

और यहाँ अजगर स्क्रिप्ट है कि चाल करता है:

import sre, sys 

rePOI = sre.compile(r'''\bclass\b|\bfunction\b|\breturn\b|["'/{}]''') 
reFun = sre.compile(r'\bfunction\b\s*((?:[gs]et\s+)?\w*)\s*\(') 
reCls = sre.compile(r'class\s+(\w+)[\s{]') 
reStr = sre.compile(r'''(["'/]).*?(?<!\\)\1''') 

def addProfilingCalls(body): 
    stack = [] 
    pos = 0 
    depth = 0 
    retvar = 0 
    klass = "" 
    match = rePOI.search(body, pos) 
    while match: 
     poi = match.group(0) 
     pos = match.start(0) 
     endpos = match.end(0) 

     if poi in '''"'/''': 
      strm = reStr.match(body, pos) 
      if strm and (poi != '/' or sre.search('[=(,]\s*$', body[:pos])): 
       endpos = strm.end(0) 

     elif poi == 'class': 
      klass = reCls.match(body, pos).group(1) 
      sys.stderr.write('class ' + klass + '\n') 

     elif poi == 'function': 
      fname = reFun.match(body, pos) 
      if fname.group(1): 
       fname = klass + '.' + fname.group(1) 
      else: 
       lastf = stack[-1] 
       lastf['anon'] += 1 
       fname = lastf['name'] + '.anon' + str(lastf['anon']) 
      sys.stderr.write('function ' + fname + '\n') 
      stack.append({'name':fname, 'depth':depth, 'anon':0}) 

      brace = body.find('{', pos) + 1 
      line = "\nvar __start__:int = flash.utils.getTimer();" 
      body = body[:brace] + line + body[brace:] 
      depth += 1 
      endpos = brace + len(line) 

     elif poi == '{': 
      depth += 1 

     elif poi == 'return': 
      lastf = stack[-1] 
      semicolon = body.find(';', pos) + 1 
      if sre.match('return\s*;', body[pos:]): 
       line = "{ Profiler.profiler.profile('" + lastf['name'] + \ 
         "', flash.utils.getTimer() - __start__); return; }" 
      else: 
       retvar += 1 
       line = "{ var __ret" + str(retvar) + "__:* =" + body[pos+6:semicolon] + \ 
         "\nProfiler.profiler.profile('" + lastf['name'] + \ 
         "', flash.utils.getTimer() - __start__); return __ret" + str(retvar) + "__; }" 
      body = body[:pos] + line + body[semicolon:] 
      endpos = pos + len(line) 

     elif poi == '}': 
      depth -= 1 
      if len(stack) > 0 and stack[-1]['depth'] == depth: 
       lastf = stack.pop() 
       line = "Profiler.profiler.profile('" + lastf['name'] + \ 
        "', flash.utils.getTimer() - __start__);\n" 
       body = body[:pos] + line + body[pos:] 
       endpos += len(line) 

     pos = endpos 
     match = rePOI.search(body, pos) 
    return body 

def main(): 
    if len(sys.argv) >= 2: inf = open(sys.argv[1], 'rU') 
    else: inf = sys.stdin 
    if len(sys.argv) >= 3: outf = open(sys.argv[2], 'wU') 
    else: outf = sys.stdout 
    outf.write(addProfilingCalls(inf.read())) 
    inf.close() 
    outf.close() 

if __name__ == "__main__": 
    main() 

, का उपयोग वितरित करने और दोनों को संशोधित करने के लिए स्वतंत्र महसूस

यहाँ के रूप में वर्ग है।

+0

वाह, अच्छा काम! – andrewrk

+0

मुझे पाइथन लिपि की लाइन 31 पर एक त्रुटि मिल रही है: UnboundLocalError: असाइनमेंट –

+0

असाइनमेंट से पहले स्थानीय चर 'क्लास' संदर्भित किया गया है, मैंने फ़ंक्शन की शुरुआत में क्लास प्रारंभ करने के लिए एक पंक्ति जोड़ा। –

2

मैंने कुछ समय पहले फ्लैश पर आधारित एक फ्लैश प्रोफाइलर लिखा था (http://snow.prohosting.com/bensch/flasp.html) आपको प्रोफाइलिंग एएसएम डालने और फिर प्रोग्राम चलाने के लिए फ्लैश का उपयोग करने की आवश्यकता है।

डेविड चांग के प्रोफाइलिंग कोड का उपयोग करने के लिए एक और (शायद) बेहतर तरीका है जिसे बिल्कुल ज्वलन की आवश्यकता नहीं है। www.nochump.com/asprof/

चियर्स

2

यह एक मेरे निजी पसंदीदा है। ध्यान दें कि यह जावा और ओपन सोर्स पर बनाया गया है। http://github.com/bengarney/PBLabsProfiler

यह फ्लैश/फ्लेक्स कंपाइलर की अनियंत्रित विशेषताओं का उपयोग करता है। फ्लैश बिल्डर अंतर्निहित प्रोफाइलर का उपयोग करता है। और हाँ! मैंने अपने कुछ फ़्लैश कोड को अनुकूलित करने के लिए सफलतापूर्वक इसका उपयोग किया है। http://jpauclair.net/flashpreloadprofiler

यह actionscript में लिखा है, एक जावा आवेदन पृष्ठभूमि में चल रहा की जरूरत नहीं है और मेमोरी प्रोफाइलर की तरह कुछ और विशेषताएं हैं:

+1

हां, पुशबटन लैब्स प्रोफाइलर बहुत काम करता है! –

0

एक FlashPreloaderProfiler नहीं है।

लेकिन मैं पसंद करते हैं PBLabsProfiler भी :)

1

मैं The Miner पाया है बहुत उपयोगी हो करने के लिए, और यह गैर-वाणिज्यिक परियोजनाओं के लिए नि: शुल्क है। इसमें सुविधाओं की एक विस्तृत श्रृंखला है लेकिन "प्रदर्शन प्रोफाइलर" लेबल वाला टैब सबसे उपयोगी रहा है। मुझे लगता है कि यह आपके कोड में बाधाओं को खोजने का एक शानदार तरीका है, या कम से कम पता है कि मुख्य कारण क्या है (रेंडरिंग, टेक्स्ट, नेटवर्क, आदि ..)।

इंस्टॉलेशन निर्देशों को ढूंढने में मुझे थोड़ा सा लगा, लेकिन यह बहुत आसान है। अपनी प्रोजेक्ट में .swc फ़ाइल शामिल करें, फिर अपने दस्तावेज़ क्लास कन्स्ट्रक्टर में कोड की 1 पंक्ति जोड़ें।

this.addChild(new TheMiner(true)); 

और जानकारी: http://www.sociodox.com/theminer/support.html

6

एडोब हाल ही में फ्लैश के लिए एक नई रूपरेखा उपकरण जारी किया है एडोब स्काउट कहा जाता है:

http://gaming.adobe.com/technologies/scout/

यह पुराने फ़्लैश बिल्डर प्रोफाइलर पर एक बड़े पैमाने पर सुधार है - यह आपको एक्शनस्क्रिप्ट निष्पादन के लिए, और प्रतिपादन और नेटवर्किंग जैसे आंतरिक प्लेयर फ़ंक्शन दोनों के लिए सीपीयू समय का एक विस्तृत टूटना देता है।

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

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