এটি একটি অদ্ভুত পারফরম্যান্স তুলনার ধরণ যেহেতু একটি নির্দিষ্ট পরিমাণে কেউ কতটা তুচ্ছ পুনরুক্তি করতে পারে তা দেখার চেয়ে সাধারণত পদার্থের কোনও কিছু গণনা করতে যে সময় লাগে তা পরিমাপ করে। আপনার পাইথন এবং জুলিয়া কোডগুলি কাজ করতে পেতে আমার সমস্যা হয়েছিল, তাই আমি জুলিয়া কোডটি কাজ করতে সংশোধন করেছি এবং পাইথন কোডটি চালাইনি। @ চেপনার একটি মন্তব্যে যেমন উল্লেখ করেছেন, অবজেক্টের now()
সাথে সময়ের তুলনা ব্যবহার করা এবং DateTime
করা মোটামুটি ব্যয়বহুল। পাইথন time.time()
ফাংশনটি কেবল একটি ভাসমান-পয়েন্টের মান দেয়। দেখা যাচ্ছে time()
যে জুলিয়া ফাংশন বলা হয়েছে যা ঠিক একই কাজটি করে:
julia> time()
1.587648091474481e9
f()
আমার সিস্টেমে আপনার আসল ফাংশনের (কাজের পরিবর্তিত) সময় এখানে রয়েছে :
julia> using Dates
julia> function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Millisecond(1000)
break
end
end
return i
end
f (generic function with 1 method)
julia> f()
4943739
সময় শেষ হওয়ার আগে এটি প্রায় 5 মিলিয়ন পুনরাবৃত্তি করেছিল। যেমনটি আমি বলেছিলাম, আমি আপনার পাইথন কোডটি আমার সিস্টেমে উল্লেখযোগ্য পরিমাণে ফিডিং ছাড়াই (যা আমি করতে বিরক্ত করি না) চালাতে সক্ষম হইনি। কিন্তু এখানে একটি সংস্করণ f()
যে ব্যবহারসমূহ time()
পরিবর্তে, যা আমি imaginatively ডাকব g()
:
julia> function g()
i = 0
t1 = time()
while true
i += 1
if time() - t1 >= 1
break
end
end
return i
end
g (generic function with 1 method)
julia> g()
36087637
এই সংস্করণটি 36 মিলিয়ন পুনরাবৃত্তি করেছিল। সুতরাং আমার ধারণা জুলিয়া লুপিং এ দ্রুত? হ্যাঁ! ঠিক আছে, আসলে এই লুপটির মূল কাজটি time()
তাই কলগুলি ... জুলিয়া প্রচুর time()
কল উত্পন্ন করতে দ্রুত !
কেন এটি সময়ের সাথে আজব? আমি যেমন বলেছি, এখানে বেশিরভাগ আসল কাজ কল করা time()
। বাকি লুপটি আসলে কিছুই করে না। একটি অনুকূলিত সংকলিত ভাষায়, সংকলক যদি এমন কোনও লুপ দেখতে পায় যা কিছুই করে না, তবে এটি সম্পূর্ণরূপে তা দূর করে দেবে। উদাহরণ স্বরূপ:
julia> function h()
t = 0
for i = 1:100_000_000
t += i
end
return t
end
h (generic function with 1 method)
julia> h()
5000000050000000
julia> @time h()
0.000000 seconds
5000000050000000
ওহো, শূন্য সেকেন্ড! কীভাবে সম্ভব? ঠিক আছে, এর তাকান এলএলভিএম কোডটি দেখুন (যেমন মেশিন কোডের মতো তবে একটি কাল্পনিক মেশিনের জন্য যা মধ্যবর্তী প্রতিনিধিত্ব হিসাবে ব্যবহৃত হয়) এটি এটিকে কমিয়ে দেয়:
julia> @code_llvm h()
; @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
; @ REPL[16]:6 within `h'
ret i64 5000000050000000
}
সংকলকটি লুপটি দেখে, ফলাফলটি প্রতিবারের মতো একই চিত্রিত করে এবং কেবল লুপটি সঞ্চালনের পরিবর্তে স্থির মানটি দেয়। যা অবশ্যই শূন্য সময় নেয়।