นี่เป็นการเปรียบเทียบประสิทธิภาพที่แปลกเนื่องจากโดยทั่วไปแล้วจะทำการวัดเวลาที่ใช้ในการคำนวณบางสิ่งบางอย่างของสารแทนที่จะเห็นว่าการทำซ้ำเล็กน้อยสามารถทำได้ในระยะเวลาหนึ่ง ฉันมีปัญหาในการทำให้รหัส Python และ Julia ของคุณทำงานดังนั้นฉันจึงปรับเปลี่ยนรหัส Julia ให้ทำงานและไม่ได้เรียกใช้รหัส Python @chepner ตามที่ระบุไว้ในความคิดเห็นการใช้now()
และการเปรียบเทียบเวลากับDateTime
วัตถุนั้นค่อนข้างแพง time.time()
ฟังก์ชั่นPython เพียงแค่ส่งกลับค่าจุดลอย เมื่อปรากฎว่ามีฟังก์ชั่น Julia ที่เรียก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 ล้านครั้งก่อนเวลาจะหมด ดังที่ฉันพูดฉันไม่สามารถรับรหัส Python ของคุณให้ทำงานบนระบบของฉันได้โดยไม่ต้องเล่นซอ (ซึ่งฉันไม่ได้สนใจ) แต่นี่เป็นรุ่นf()
ที่ใช้time()
แทนซึ่งฉันจะจินตนาการถึงการโทร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 ล้าน ดังนั้นฉันเดาว่า Julia เร็วขึ้นเมื่อวนลูป? เย้! ที่จริงแล้วงานหลักในลูปนี้คือการโทรไป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
ว้าวศูนย์วินาที! เป็นไปได้อย่างไร? ลองดูรหัส LLVM (เช่นรหัสเครื่อง แต่สำหรับเครื่องจินตภาพที่ใช้เป็นสื่อกลาง) สิ่งนี้จะลดลงไปที่:
julia> @code_llvm h()
; @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
; @ REPL[16]:6 within `h'
ret i64 5000000050000000
}
คอมไพเลอร์มองเห็นลูปซึ่งแสดงให้เห็นว่าผลลัพธ์นั้นเหมือนกันทุกครั้งและเพียงแค่ส่งกลับค่าคงที่แทนการดำเนินการลูปจริง ซึ่งแน่นอนต้องใช้เวลาเป็นศูนย์