मैंने प्रश्न Why does Process.fork make stuff slower in Ruby on OS X? देखा और यह निर्धारित करने में सक्षम था कि Process.fork
वास्तव में धीमी गति से कार्य करता है।ओएस एक्स (और पायथन में नहीं) पर रुबी में एक फोर्क प्रक्रिया में 'टाइम.यूटीसी' धीमा क्यों है?
हालांकि, ऐसा लगता है कि यह Time.utc
विशेष रूप से बहुत धीमी है।
main: 0.100000 0.000000 0.100000 ( 0.103762)
fork: 0.530000 3.210000 3.740000 ( 3.765203)
main: 0.100000 0.000000 0.100000 ( 0.104218)
fork: 0.540000 3.280000 3.820000 ( 3.858817)
main: 0.100000 0.000000 0.100000 ( 0.102956)
fork: 0.520000 3.280000 3.800000 ( 3.831084)
एक संकेत हो सकता है कि इसके बाद के संस्करण ओएस एक्स पर जगह लेता है, जबकि Ubuntu पर, वहाँ एक अंतर हो प्रतीत नहीं होता:
main: 0.100000 0.070000 0.170000 ( 0.166505)
fork: 0.090000 0.070000 0.160000 ( 0.169578)
main: 0.090000 0.080000 0.170000 ( 0.167889)
fork: 0.100000 0.060000 0.160000 ( 0.169160)
main: 0.100000 0.070000 0.170000 ( 0.170839)
fork: 0.100000 0.070000 0.170000 ( 0.176146)
require 'benchmark'
def do_stuff
50000.times { Time.utc(2016) }
end
puts "main: #{Benchmark.measure { do_stuff }}"
Process.fork do
puts "fork: #{Benchmark.measure { do_stuff }}"
end
यहाँ कुछ परिणाम हैं
क्या कोई इस विषमता को समझा सकता है?
आगे की जांच:
@tadman सुझाव दिया कि यह MacOS/ओएस एक्स बार कोड में एक बग हो सकता है, तो मैं अजगर में एक समान परीक्षण लिखा है:
from timeit import timeit
from os import fork
print timeit("datetime.datetime.utcnow()", setup="import datetime")
if fork() == 0:
print timeit("datetime.datetime.utcnow()", setup="import datetime")
else:
pass
फिर, Ubuntu पर , बेंचमार्क फोर्क/मुख्य प्रक्रियाओं के लिए समान हैं। ओएस एक्स पर, हालांकि, मुख्य प्रक्रिया की तुलना में फोर्क की गई प्रक्रिया अब तेज है, जो रूबी में व्यवहार के विपरीत है।
इससे मुझे विश्वास होता है कि "कांटा जुर्माना" का स्रोत रुबी कार्यान्वयन में है और ओएस एक्स समय कार्यान्वयन में नहीं है।
क्या यह प्रति कांटा परत प्रति दंड है, जैसे कि यह एक और उप-कांटा में डबल होगा? क्या माता-पिता की प्रक्रिया समाप्त होने पर वह जुर्माना दूर हो जाता है? क्या यह धागे के अंदर लागू होता है? – tadman
@tadman कूल सवाल। यह प्रति कांटा परत प्रति दंड नहीं है; अगली-स्तरीय कांटा में पहली कांटा के समान सटीक निष्पादन समय होता है। यदि मैं कर सकता हूं तो मैं बाकी परिदृश्यों की जांच करूंगा। –
मै मैकोज़ 10.12 पर रूबी 2.3.3 के साथ वही व्यवहार देख रहा हूं, लेकिन इसे फेडोरा पर पुन: उत्पन्न नहीं कर सकता। यह संभवतः मैकोज़ पर समय कोड के साथ एक मुद्दा है, इसलिए यह एक बग रिपोर्ट दर्ज करने लायक हो सकता है। मेरा मानना है कि यह किसी कारण से समय से संबंधित कार्यों के लिए अलग है। – tadman