Erlang

2010-12-27 14 views
7

में सटीक घड़ी मैं एक प्रक्रिया को कार्यान्वित करने के बारे में सोच रहा था जो शुरू होने के बाद से होने वाले समय में अलग अंतराल की संख्या देता है। क्या मैं यहां सटीकता खो रहा हूं? कुछ समय बाद और भारी ग्राहक दुर्व्यवहार के बाद सटीकता के नुकसान के बिना मैं इसे कैसे कार्यान्वित करूं। मैं एर्लांग में ऐसा करने के तरीके पर फंस गया हूं।Erlang

स्वाभाविक रूप से मैं अब सिस्टम (जैसे) सिस्टम सिस्टम का उपयोग नहीं करना चाहता हूं।

-module(clock). 
-compile([export_all]). 

start(Time) -> 
    register(clock, spawn(fun() -> tick(Time, 0) end)). 

stop() -> clock ! stop. 

tick(Time, Count) -> 
    receive 
     nticks -> 
      io:format("~p ticks have passed since start~n", [Count]) 
    after 0 -> true 
    end, 
    receive 
     stop -> 
      void 
    after Time -> 
      tick(Time, Count + 1) 
    end. 

उत्तर

10

मैनुअल टिक की तरह आप कर रहे हैं गिनती सही होने की मामूली शेड्यूलिंग में उतार-चढ़ाव के साथ ही समारोह निष्पादन भूमि के ऊपर की वजह से नहीं जा रहा है।

प्रक्रिया करना शुरू होता है और कार्य में प्रत्येक रिकर्सिव कॉल में पास होने पर timestamp को पकड़ना है। फिर, जब आप प्रक्रिया शुरू करने के बाद से गुजरने वाली संख्याओं (माइक्रोसॉंड में) को पकड़ना चाहते हैं, तो एक नया टाइमस्टैम्प लें और उन्हें now_diff में पास करें।

ऐसा लगता है कि आप "टिक्स" की अपनी अवधारणा का उपयोग कर रहे हैं, ताकि आप यह पता लगा सकें कि आपके "टिक" कितने माइक्रोसॉन्ड हैं और इसके द्वारा आपके अंतिम परिणाम को विभाजित करें।

+0

हाँ मुझे लगता है कि यह सबसे आसान तरीका है .. मैं अभी भी "बाद में" टाइमआउट के साथ "टिक रिज़ॉल्यूशन" की अवधारणा का उपयोग कर सकता हूं, जो कि रिकर्सिव कॉल की संख्या को कम करने के लिए है। – buddhabrot